这是一个简单的模板;
template <class T>
class tt {
private:
T x;
public:
tt() {x=0;};
Add(T p) {x += p;};
};
...然后是它的子类;
class cc : public tt<int> {
public:
cc() : tt() {};
};
这在VC中编译很好,但在C ++ Builder(XE)中没有给出E2102错误。 C ++ Builder编译器需要在cc类的构造函数上使用以下语法进行编译;
cc() : tt<int>() {};
事实上,每次在cc类中提到tt模板时,C ++ Builder编译器都需要重复模板参数。
标准C ++规范是否指定了不断重复模板参数的需要,或者C ++ Builder编译器是否错误?
答案 0 :(得分:3)
C ++ Builder在这里是错误的。您应该能够在构造函数的成员初始化列表中使用祖先名称的原因与注入类名的概念有关。
定义类时,编译器会将类的名称插入到该类中,并使其引用自身。这个注入名称允许您在类中使用没有模板参数的类的名称。
template <class T>
struct tt {
// The compiler behaves as if there was the following.
// typedef tt<T> tt;
};
这个注入名称是在成员初始化列表中使用名称tt
时查找的名称。
(对于记录,clang接受没有模板参数的片段。)
加分:您是否已将cc
定义为具有模板参数T
的类模板,而祖先依赖于T
,名称为{{1}在tt
的构造函数的成员初始化列表的上下文中找不到。
cc
答案 1 :(得分:0)
您可以使用typedef来避免重复:
typedef tt<int> tti;
...
class cc : public tti {
public:
cc() : tti() {};
};