2011-10-31 89 views
0

这段代码有什么问题? gcc 4.6.1抱怨“'foo'没有在此范围内声明”in 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'时,它不知道_which_'Bar '是否可以继承(稍后可能会有专门化),所以它还不知道有'foo'成员。通过验证,你告诉它'''将有'foo'成员,直到'N'被知道之前不用担心它。 –

+0

这也适用:“this-> foo;” – Syncopated

1

foo是一个从属名称;也就是说,它依赖于模板参数,所以直到模板被实例化,编译器才知道它是什么。您必须明确表示它是班级成员,可以是Bar<N>::foothis->foo。 (你可能也想用它做一些事情;只是使用它作为表达式的忽略值根本不会做任何事情)。