2011-09-09 7 views
2
class A { 
private: 
    A& operator=(const A&); 
}; 

class B : public A { 
public: 
    B& operator=(const A&) { 
      return *this; 
    } 
}; 


int main() { 

    B b1; 
    B b2; 

    b1 = b2; 

    return 0; 
} 

이 compilaton에 오류 준다 : B :: 연산자 = (A &)는 비표준 서명을 가지기 때문에할당 연산자

은, 컴파일러가 자신 B의 생성
test.cpp: In member function 'B& B::operator=(const B&)': 
test.cpp:16:5: error: 'A& A::operator=(const A&)' is private 
test.cpp:19:20: error: within this context 
test.cpp: In function 'int main()': 
test.cpp:31:7: note: synthesized method 'B& B::operator=(const B&)' 
first required here 
Build error occurred, build is stopped 

:: operator = (B &) A :: operator (A &)를 호출하려고 시도합니다 (A &).

B 인수에도 B :: operator = (A &)를 사용할 수있는 컴파일러가 있습니까?

답변

7

확실히. 교환 원을 직접 정의한 다음 operator=(const A&)으로 착신 전환하십시오.

class B : public A { 
public: 
    B& operator=(const A&) { 
      return *this; 
    } 

    B& operator=(const B& other) { 
     return *this = static_cast<const A&>(other); 
    } 
}; 
0

이 문제는 내가 나쁜 개념 냄새에 연관는 C++를 잡았다입니다.

문제는 잘못된 해결책 일 수 있습니다. 또한 완벽한 해결책이 없습니다. 원하는만큼 열심히 시도하십시오. 구현 된 솔루션에는 항상 잘못된 것이 있습니다. 여기

이 중복 된 질문에 (조금) 더 완전한 해답 : 할당 연산자가 개인 인 경우 How to use base class's constructors and assignment operator in C++?

BTW,이 기본 클래스의 저자가 알고 아주 잘 그 엔티티 것을 명확한 기호입니다 의미값 의미은 잘 섞이지 않습니다. 그를 믿어, 그는 옳았다!

+0

내가 너무 기본 클래스의 저자입니다. 내가하고 싶은 것은 불변의 기본 클래스를 가지고 파생 된 클래스에 "돌연변이"함수를 추가하는 것입니다. 연산자 =()의 rhs 만 읽히므로 인수를 기본 클래스에 대한 참조로 만드는 것이 좋습니다. – Pibben

0

상속 된 유형으로 연산자 오버로딩을 사용하는 것은 좋지 않은 생각입니다. C++에서는 연산자 오버로딩과 관련하여 지원되는 각 유형에 대한 함수를 명시 적으로 제공하는 것이 좋습니다.

나는 너무 오래 전에이 함정에 직접 들어갔다. C++ 사람들이이 기능을 어떻게 사용했는지 살펴 보려면 템플릿 전문화 인 std::vector<bool>을 살펴 보는 것이 좋습니다.

어쩌면 당신은이 문제를 해결하는 데 도움이 될 수 있습니다 대답 위 : C++ Abstract class operator overloading and interface enforcement question

또 다른 가능한 해결책은 다음과 같습니다

class B { 
public: 
    B& operator=(const A&) { 
    return *this; 
    } 
}; 

class A { 
private: 
    A& operator=(const A&); 
public: 
    operator B() { /* do stuff to convert from A to B */ } 
}; 

int main() { 

    B b1; 
    B b2; 

    b1 = b2; 

    return 0; 
} 
관련 문제