2010-04-02 4 views
3

2 단계 조회 질문 : 이 코드를 작성하는 더 복잡한 방법이 있습니까? 예 : using 지시문을 모두 사용하지 않으시겠습니까? using CBase<T>;과 같은 것은 내가 좋아하지만 받아 들여지지 않았습니다. 내 진짜 코드에서2 단계 검색 : "코드 팽창"을 피할 수 있습니까?

#include <iostream> 

template <typename T> 
class CBase 
{ 
protected: 
    int a, b, c, d; // many more... 

public: 
    CBase() { 
     a = 123; c = 0; 
    } 
}; 


template <typename T> 
class CDer : public CBase<T> 
{ 
// using CBase<T>;  // error, but this is what I would like 
    using CBase<T>::a; 
    using CBase<T>::b; 
    //... 

public: 
    CDer() { 
     std::cout << a << this->c; 
    } 
}; 


int main() 
{ 
    CDer<int> cd; 
} 

더 많은 멤버 변수/기능이 있고, 어떤 방법으로 짧은 코드를 작성할 수 있는지 궁금했다.
물론 this->c 구문을 사용해도 문제가 해결되지는 않습니다 ...

감사합니다!


GCC 4.1 맥 OS X 10.6

+0

'std :: cout << this-> a;'는 어떻습니까? – kennytm

+1

또는'std :: cout << a;'를 사용하는 지시어가 없으면 어떨까요? 수퍼 클래스의 보호 된 멤버에 액세스 할 수 있습니다. –

+1

@Alex :'오류 : '이 범위에서'가 선언되지 않았습니다. ' – kennytm

답변

2

나는 테스트 케이스를 감소 다음 세 가지 옵션

template<typename T> struct Base { int a; }; 

옵션 1

template<typename T> struct Der : Base<T> { 
    void f() { 
    int &ra = Der::a; 
    // now use ra 
    } 
} 

옵션 2

을 고려

옵션 3

// use your using declarations 
+0

글쎄, 대신 : int & ra = Der :: a; 나는 using 지시어를 사용할 것이다. 그것은 더 짧고 더 명백합니다. 나는 그것을 할 방법이 없다고 생각하기 시작했습니다. 이 구문이 받아 들여지면 좋았을 것입니다 : CBase ; – Pietro

+0

@Pietro, 컴파일러는 어떤 이름을 볼 수있게 만들지 모르기 때문에, naught의 정규화되지 않은 이름을 기본으로 찾지 않는 것을 전제로합니다. 간단한'a '는'T' 템플릿 매개 변수와 명백한 관계가 없다는 아이디어입니다. 그리고 기본이 정의하는 변수에 따라 다른 의미를 가지게됩니다 (심지어 사적인 변수도 그 의미를 바꾸고 액세스를 부적절하게 만듭니다!). 기본 클래스는 주어진 'T'에 대해 특수화 될 수 있습니다. 기본 클래스가 정의하는 의미에 따라 * 원하는 * 것을 명시 적으로 선언해야합니다. –

+0

당신은 더 나은 항복 했단 말인가요? 결국 그것은 단순한 문체의 세부 사항입니다. 나는 내 자신을 죽이지 않을 것이라고 생각한다. – Pietro

0

그것은 그 변수의 대부분은 매개 변수가있는 것처럼 보이지 않는다. CBase 모두 사용합니까, 아니면 a입니까? 그렇지 않은 경우 CDer의 새 템플릿이 아닌베이스로 이동하십시오.

또는 모두 POD 구조체에 포장 한 다음 using CBase<T>::m_ints;.

높은 오버 헤드 솔루션 : 템플릿이 적용되지 않음 virtual베이스.

잘 모르겠지만 시도해 볼 가치가 있습니다. 의 정의를 안에 중첩 한 다음 typedef을 네임 스페이스 범위로 중첩합니다.

+0

예, 실제 코드의 변수가 매개 변수화되어 CBase에서 모두 사용합니다. 비 템플릿 기본 클래스에서 변수를 이동하면 CBase의 문제는 해결되지만 CDer는 해결되지 않습니다. POD는 여전히 모든 변수에 using 지시문을 추가하도록 강요합니다. 가상의 오버 헤드는 적당하지 않습니다. – Pietro