2011-05-17 112 views
3

你能告诉我,我错过了什么?模板类继承问题

template <class T> struct Base 
{ 
    T data; 
    Base(const T &_data):data(_data) { } 
}; 

template <class T> struct Derived : Base<T> 
{ 
    Derived():Base(T()) {} //error: class 'Derived<T>' does not have any field named 'Base' 
}; 
+0

正如其他人指出的那样,如果将'Base(T())'更改为'Base (T())',它会进行编译。但是有没有人可以告诉我们这两个编译器中的哪一个是正确的? – TonyK 2011-05-17 09:30:46

回答

8
template <class T> struct Derived : Base<T> 
{ 
    Derived():Base<T>(T()) {} 
}; 
+0

谢谢,尼尔·巴特沃斯! – Ryan 2011-05-17 09:26:26

+0

一个很好的帮助是一个typedef的基地'typedef基地超'。 :)当你在基地有多个模板参数时,帮助很大。 – Xeo 2011-05-17 09:33:35

+0

伟大的建议,Xeo! – Ryan 2011-05-17 09:37:55

1

总还是有问题:谁是正确的?海湾合作委员会就在这里。非限定名称查找不查看依赖基类,因此在Base<T>范围内找不到Base。您可以将您的代码更改为以下标准符合性变异太

Derived():Derived::Base(T()) {} 

如果我没记错的话,这只能由GCC4.5虽然支持。早期版本没有正确实现注入的类名查找。