2011-02-18 8 views
2

가능한 중복 :
What does “operator = must be a non-static member” mean? (C++)C++ 세계적으로 오버로드 된 연산자 =

안녕,

I가 다음 코드 ...

// Header file 
    struct dataRecord{ 
    size_t id; 
    char name[gcNameLength]; 
    }; 

    void operator=(dataRecord &adr, const dataRecord &bdr); 

어떻게 이제까지의 gcc 나에게 팔로티를 준다. 컴파일 할 때 오류가 발생합니다.

error: ‘void operator=(dataRecord&, const dataRecord&)’ must be a nonstatic member function 

도움 주셔서 감사합니다.

+0

"비 정적 멤버 함수해야합니다 : 당신이 연산자를 오버로드 할 때 흐름을 중단하지 않을 것이며 expressios 같이 할 수 있도록 = 당신이, 왼쪽 피연산자에 대한 참조를 반환해야 함을

주 "- 여기서 명확하지 않은 것은 무엇입니까? –

+0

오류 메시지는이 경우 매우 정확하게 문제를 알려줍니다. '연산자 ='를 오버로드하려면 전역 함수로 사용할 수 없습니다. 비 정적 멤버 함수 (전역 변수를 사용하는 일반적인 이유는 왼쪽 피연산자에 대해 변환을 허용하는 것이지만 어쨌든 할당의 경우에는 적용되지 않습니다. –

+0

그래서 구조체의 일부가 전역 일 수 없어야합니다. – Thomas

답변

5

struct dataRecord 자체에서 = 작업을 오버로드해야합니다. 같은

뭔가 :

struct dataRecord{ 
    size_t id; 
    char name[gcNameLength]; 
    dataRecord& operator= (const dataRecord&) { 
     // write overload code here 
    } 
}; 
+0

참고 : 참조로 반환하십시오. –

+0

@ Martin : 고마워! 그것을 수정했습니다. –

2

연산자 = 기능 같은 것이 없습니다. 연산자는 클래스 또는 구조체의 멤버 여야합니다. 이 함수에 대한 인수는 rvalue로 간주됩니다. member 함수가있는 객체는 lvalue입니다.

2

What does “operator = must be a non-static member” mean?에서 설명한 것처럼 연산자 오버로드는 멤버 함수 여야합니다.

dataRecord r1; 
dataRecord r2; 
... 
dataRecord r3 = r2 = r1; 
+0

좋은 일자리를 얻는 것 –

+0

나는 operator =로부터 void를 돌려 주어도 상관 없습니다. 특히 복사하는 것이 비쌀 경우. 일반적인 기대되는 동작은 참조를 반환하는 것이지만 사용 비용에 대해 측정해야한다는 것을 알고 있습니다. –

+0

참조를 반환하는 것은 비용이 많이 들지 않습니다. 함수가 인라인이라면 대부분의 컴파일러가이를 최적화하고 자유 다. – fbafelipe