4

기본 클래스에 operator->의 두 버전 (const에 과부하 됨)이 있다고 가정합니다. 내가 파생 클래스에서 선언 및 const 오버로드 사용

using Base::operator->; 

을 말한다면, 나는 두 버전 아니면 그냥 const가 아닌 하나의 액세스를받을 수 있습니까?

답변

4
이름 숨기기로

같은 사업 그것의 전부 또는 아무것도 선언을 사용 (7.3.3)는 이름이 아닌 회원을 가지고 .

는 ISO/IEC 14882 (2003), 7.3.3. 1/A 사용 선언이 사용 선언이 나타나는 선언적 영역에 이름을 소개한다. 즉, 이름은 이름 동의어 인 다른 곳에서 선언 된 일부 법인의 경우

7.3.3을 읽기를 권장합니다. 내부에는 미묘한 부분이 있습니다. 당신은 템플릿을 선언 할 수없고, 모든 멤버는 당신이 사용하는 이름을 참조 할 수 있어야합니다. 선언은 접근 가능해야합니다. 사용 선언문이 발견 된 블록의 이름과 함께 과부하 해결을위한 이름이 고려됩니다 (즉, 아무것도 숨기지 않습니다.) 등등.

3

부모의 이름이 같은 메소드/연산자의 모든 버전에 액세스 할 수 있습니다.

2

둘 다. 너 시도 했니? (빌어 먹을이 대답이 짧은 :. 잘 아, 여기 예입니다.

#include <iostream> 
#include <string> 

struct bar 
{ 
    void foo() { std::cout << "non_c:foo()" << std::endl; } 
    void foo() const { std::cout << "c:foo()" << std::endl; } 
}; 

class base 
{ 
public: 
    bar* operator->() { return &b; } 
    bar const* operator->() const { return &b; } 

private: 
    bar b; 
}; 

class derived : public base 
{ 
public: 
    using base::operator->; 
}; 


int main(void) 
{ 
    const derived d = derived(); 
    derived e; 

    d->foo(); 
    e->foo(); 
} 
+3

나는 특정 컴파일러로 무언가를 시도함으로써 언어의 의미를 배우기를 거부한다. – fredoverflow

+0

@Fred, 사실이지만 순수한 호기심? 단순히 표준을 읽지 않는 이유는 무엇입니까? – Nim

+2

@ 님 : 당신이 무언가를 알고 싶을 때마다 전체 표준을 읽는 것은 모든 것을 암기하는 것처럼 조금 비현실적입니다. 그래서 실제 인덱스보다 더 잘 작동합니다 ;-) –

관련 문제