2011-10-31 2 views
0

이 코드의 잘못된 점은 무엇입니까? gcc 4.6.1에서 "foo가이 범위에서 선언되지 않았습니다"라는 불평을 baz()에서 나타냅니다. 템플릿 중 하나가 일반 클래스 일 수 있도록 코드를 변환하면 문제가 사라집니다.C++ 클래스 템플릿 상속 퍼즐

struct Foo { 
    char foo; 
}; 

template<int N> 
struct Bar : public Foo 
{ 
    Bar() { foo; } 
}; 

template<int N> 
struct Baz : public Bar<N> 
{ 
    void baz() { foo; } 
}; 

int main() { 
    Baz<10> f; 
    return 0; 
} 
+2

당신이 여기서하려고하는 것을 이해하지 못했습니다. Bar() {foo;} foo 란 무엇입니까? – badmaash

+0

이것을 종속 이름이라고합니다. http://womble.decadent.org.uk/c++/template-faq.html#base-lookup – Suma

+0

가능한 복제본 [이 C++ 템플릿 코드가 왜 컴파일되지 않습니까?] (http://stackoverflow.com/questions)를 참조하십시오./1364837/why-doesnt-this-c-template-code-compile) – Suma

답변

1

뭐가 문제, 사양에 따라, 나도 몰라,하지만 당신은 사용하여 컴파일 코드를 만들 수 있습니다

void baz() { Bar<N>::foo; } 
+6

무엇이 잘못 되었나요?'Baz '를 컴파일하는 동안'Bar '이 (아직 전문화가있을 수 있습니다) 모르기 때문에 'foo' 멤버가 있다는 것을 아직 모릅니다. 그것을 qualifiying함으로써, 당신은'Bar '이'foo' 멤버를 가질 것이고'N'이 알려질 때까지 걱정하지 않을 것이라고 말하고 있습니다. –

+0

이것은 또한 작동합니다 : "this-> foo;" – Syncopated

1

foo 종속 이름입니다; 즉, 템플릿 매개 변수에 따라 달라 지므로 템플릿이 인스턴스화 될 때까지 컴파일러는 그 템플릿이 무엇인지 모릅니다. 반원임을 분명히해야합니다 (Bar<N>::foo 또는 this->foo).

(아마도 무언가를 사용하고 싶을 수도 있습니다. 단순히 표현식의 무시 된 값으로 사용하면 아무 것도하지 않습니다).