C++ 初始化作为模板实例的基类时不需要模板参数?
我有一个非模板类,它派生自一个特定的模板实例。通常,基类必须在派生类的构造函数中初始化。我发现在调用构造函数时可以省略特定的模板参数:主要的编译器(VC、g++、clang)接受它。这看起来很奇怪,因为类模板本身不是类名:C++ 初始化作为模板实例的基类时不需要模板参数?,c++,templates,initialization,base-class,C++,Templates,Initialization,Base Class,我有一个非模板类,它派生自一个特定的模板实例。通常,基类必须在派生类的构造函数中初始化。我发现在调用构造函数时可以省略特定的模板参数:主要的编译器(VC、g++、clang)接受它。这看起来很奇怪,因为类模板本身不是类名: $cat template-base.cpp&&g++--pedantic-o template base template-base.cpp&&./template base 模板 结构T { T(int){} }; 结构DT:public T { //注:T(42)是可
$cat template-base.cpp&&g++--pedantic-o template base template-base.cpp&&./template base
模板
结构T
{
T(int){}
};
结构DT:public T
{
//注:T(42)是可能的,但不是必需的。
//T(42)是一个错误(“T不是基类”,这是正确的)。
DT():T(42){}
};
int main()
{
DT;
}
(Johannes Schaub回答了这个问题,其中派生类本身也是一个模板。在这种情况下,模板参数是强制性的,尽管它在那里同样可以扣除。)
为什么我可以在这里使用类似类名的模板名<代码>T不是一个类 这与天气有关。当类模板用作基类时,该语言允许您像指定参数一样使用模板的名称,因为它知道这些参数是什么。做
DT(): T(42) {}
扩展到
DT(): T<1>(42) {}
DT():T(42){
由编译器为您提供
允许这样做的标准语言可以在中找到,“当类模板用作基类时”听起来有点不确定。注入的类名不是基类的特殊情况,它是在派生类中找不到
t
之后通过基类中的名称查找找到的。在基类是依赖类型的情况下,或者在派生类中存在成员T
时,这是相关的。