2016-11-23 6 views
0

템플릿을 사용하는 방법과 연산자를 오버로드하는 방법을 배우고 있습니다. operator[]에 오버로드를 처리했지만 operator+operator= 오버로드 문제가 발생했습니다.연산자 '='와 '+'오버로드

'+': is not a member of 'A<T>'

'=': is not a member of 'A<T>'

'operator =' must be a non-static member

내가 잘못 뭐하는 거지 : 내가 컴파일하려고 Whenver

template <class T> 
class A 
{ 
public: 
    //... 
    friend A<T>& A<T>::operator+ (A<T>&, const A<T>&); 
    friend A<T>& A<T>::operator= (A<T>&, const A<T>&); 
}; 

template<class T> A<T>& A<T>::operator+ (A<T>& left, const A<T>& right) 
{ 
    //some functions 
return left; 
} 

template<class T> A<T>& A<T>::operator= (A<T>& left, const A<T>& right) 
{ 
    //some functions 
    return left; 
} 

, 나는 이러한 오류를 얻을 : 여기 내 코드는?


편집 :

나는 코드 업데이트 관리했습니다

:

template <class T> 
class A 
{ 
public: 
    //... 
    A<T> operator+ (A<T>); 
    A<T> operator= (A<T>, const A<T>); 
}; 

template<class T> A<T> A<T>::operator+ (A<T> right) 
{ 
    //some functions 
    return *this; 
} 

template<class T> A<T> operator= (A<T> right) 
{ 
    //some functions 
    return *this; 
} 

operator+ 작품처럼 지금은 잘 보이지만 컴파일러는이 오류 제공합니다

'operator=' must be a non static member

왜 고정 회원입니까? 어떻게 고칠 수 있습니까? 우선 할당 사업자

+0

는 함수 정의에서의' ::'범위를 제거합니다. –

+0

아, 미안, 깜빡했다. 템플릿 매개 변수는 _ "상속 된"_ 선언을하지 않습니다.템플릿을 '템플릿 친구 A & operator + (A & const A &);' –

+0

으로 설정해야합니다. 확실합니까? 컴파일러의 내부 오류가 발생했습니다 : P 신경 쓰지 마라. 여전히 'not member'오류를 생성한다./ – Executor1909

답변

1

는 비 정적 멤버 함수는 C++ 표준에서

(13.5.3 지정)

1 An assignment operator shall be implemented by a non-static member function with exactly one parameter. Because a copy assignment operator operator= is implicitly declared for a class if not declared by the user (12.8), a base class assignment operator is always hidden by the copy assignment operator of the derived class.

그리고 두 번째 (11.3 친구) 따라서

1 A friend of a class is a function or class that is given permission to use the private and protected member names from the class. A class specifies its friends, if any, by way of friend declarations. Such declarations give special access rights to the friends, but they do not make the nominated friends members of the befriending class.

해야합니다 예 :이 정의

template<class T> A<T>& A<T>::operator+ (A<T>& left, const A<T>& right) 
         ^^^^^ 
{ 
//some functions 
return left; 
} 

이 잘못되었습니다. 연산자가 클래스의 멤버가 아니기 때문에 최소한 A<T>::을 제거해야합니다.

+0

예, 완전히 잊어 버렸습니다. 그래서 이제 친구와 'A ::'을 삭제했지만 여전히 마지막 오류가 발생합니다. 해당 연산자는 정적이 아닌 멤버 여야합니다. 어떻게 정적이 아닌 만들 수 있습니까? 사실, 나는 내 연산자 [] definiton을 살펴 보았지만 동일한 실수가 있었지만 컴파일러에서 저에게 해봅시다 : P 이제 '정적 멤버가 아닌'오류도 발생합니다 : C – Executor1909

+0

@ Executor1909 하나 더 읽으십시오 스탠다드의 인용문. 오퍼레이터는 하나의 매개 변수만을 가져야한다. –

+0

예, 압니다 만, 이전 오류가 사라지는 지 확인하기 위해 변경했습니다. 이제는 매개 변수가 하나뿐입니다. 'Non static'오류가 여전히 발생합니다. – Executor1909

0

비 정적 멤버로 구현 된 연산자는 오른쪽 피연산자 인 1 개의 입력 매개 변수 만 받아 들여야합니다. 왼쪽 피연산자는 연산자가 호출되는 this 개체입니다.

정적 멤버 또는 비 멤버로 구현 된 연산자는 2 개의 입력 매개 변수 인 왼쪽 및 오른쪽 피연산자를 허용해야합니다.

operator=은 2 개의 입력 매개 변수가있는 비 정적 구성원으로 잘못 선언되었습니다.

또한 operator+은 함께 추가 된 두 입력 개체의 복사본 인 새 개체를 반환하기위한 것입니다. 연산자가 호출 된 객체에 대한 참조를 반환하지 마십시오. operator=은 할당 된 개체에 대한 참조를 반환하기위한 것입니다.

이 시도 :

template <class T> 
class A 
{ 
public: 
    //... 
    A<T> operator+(const A<T>&) const; 
    A<T>& operator=(const A<T>&); 
}; 

template<class T> A<T> A<T>::operator+(const A<T>& right) const 
{ 
    A<T> result(*this); 
    //some functions to add right to result as needed... 
    return result; 
} 

template<class T> A<T>& A<T>::operator=(const A<T>& right) 
{ 
    // some functions to copy right into this... 
    return *this; 
}