2016-12-11 11 views
3

<< 연산자를 재정의하려고하는데 컴파일러가 내 구현을 인식하지 못하고 대신 비트 시프트로 해석하려고합니다. 나는 매개 변수 유형 (const T&, T&, T, const T)을 사용하지 않고 이미 놀려고했습니다.<< 연산자가 인식되지 않습니다.

#pragma once 

template<typename T> class AbstractStack 
{ 
    public: 
     virtual bool Push(const T &) = 0; 
} 

template <typename T> class ArrayStack : public AbstractStack <T> 
{ 
    public: 
     bool Push(const T&) { 
      .... 
     } 
} 

template <typename T> bool operator<<(const AbstractStack<T>* &, const T&) { 
    return stack->Push(item); 
} 


int main() { 
    AbstractStack<int> *stack = new ArrayStack<int>(5); 
    int a = 2; 
    stack << a; // <<-- compiler error 
    return 0; 
} 

보고 된 오류는 다음과 같습니다

Error (active)  expression must have integral or unscoped enum type Lab10 
Error C2296 '<<': illegal, left operand has type 'AbstractStack<int> *' 

나는 값으로 클래스에 작용하는 같은 연산자를 그냥 작동 ... 정의하면

+3

적어도 하나의 클래스 유형의 객체 만 사용하여 연산자를 오버로드 할 수 있습니다. 하나의 인수에 대해 포인터가 있고 다른 인수는 정수입니다. – 0x499602D2

+0

ArrayStack의 멤버 함수로 연산자를 선언하십시오. – Ripi2

+0

다음을보십시오. http://stackoverflow.com/questions/6171630/why-isnt-operator-overloading-for-pointers-allowed-to-work – NPE

답변

3

사업자, 적어도 하나의 오버로드 인수는 클래스 또는 열거 형이어야합니다. 기본적으로이 클래스는 사용자 정의 유형 (사용자 정의 유형)의 오버로드를 허용하거나 제한합니다.

cppreference에서부터;

연산자가 표현식에 나타나고 피연산자 중 하나 이상에 클래스 유형 또는 열거 유형이있는 경우 과부하 확인은 다음과 같은 모든 함수 중에서 호출 할 사용자 정의 함수를 결정하는 데 사용됩니다. 서명은 다음과 일치합니다 ...

이렇게하면 내장 유형이 오버로드되는 것을 방지 할 수 있습니다. 이 경우 , 포인터로 가지고있는 정수와 인자로 가지고있는 정수.

이미 질문에 언급했듯이 해결책은 참조로 첫 번째 인수를 취하고 있습니다. 당신이 당신이 될 것입니다 불구하고 (오버로드 된 연산자의 리소스를 관리 할 수 ​​있도록하고, "포인터"의 사용을 만들기 위해 std::shared_ptr의 사용을 조사 할 수 사용 찾고있는 추상 기본 클래스 감안할 때

template <typename T> 
bool operator<<(AbstractStack<T> &, const T&) 
{ //... 

스마트 포인터);

다른 말했듯
template <typename T> 
bool operator<<(std::shared_ptr<AbstractStack<T>>&, const T&) 
{ 
    return stack->Push(item); 
} 

int main() { 
    std::shared_ptr<AbstractStack<int>> stack = std::make_shared<ArrayStack<int>>(5); 
    int a = 2; 
    stack << a; 
    return 0; 
} 
2

는 어떤 내장 연산자 과부하되면 사용자 정의 타입의 객체 필요하며 포인터가 작동하지 않습니다. 그리고 해결책은 포인터 대신 객체를 사용하는 것입니다 :

template <typename T> bool operator<<(AbstractStack<T>&, const T&) { 
    return stack.Push(item); 
} 

그런 다음 객체와 함께 호출하십시오. 프리 스토어에서 할당 한 코드에는 아무런 이유가 없습니다.

int main() { 
    ArrayStack<int> stack(5); 
    int a = 2; 
    stack << a; 
    return 0; 
} 
+0

@Angew - 감사. 결정된. –