Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化作为模板实例的基类时不需要模板参数?_C++_Templates_Initialization_Base Class - Fatal编程技术网

C++ 初始化作为模板实例的基类时不需要模板参数?

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)是可

我有一个非模板类,它派生自一个特定的模板实例。通常,基类必须在派生类的构造函数中初始化。我发现在调用构造函数时可以省略特定的模板参数:主要的编译器(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)是可能的,但不是必需的。
//T(42)是一个错误(“T不是基类”,这是正确的)。
DT():T(42){}
};
int main()
{
DT;
}
(Johannes Schaub回答了这个问题,其中派生类本身也是一个模板。在这种情况下,模板参数是强制性的,尽管它在那里同样可以扣除。)

为什么我可以在这里使用类似类名的模板名<代码>T不是一个类

这与天气有关。当类模板用作基类时,该语言允许您像指定参数一样使用模板的名称,因为它知道这些参数是什么。做

DT(): T(42) {}
扩展到

DT(): T<1>(42) {}
DT():T(42){
由编译器为您提供


允许这样做的标准语言可以在

中找到,“当类模板用作基类时”听起来有点不确定。注入的类名不是基类的特殊情况,它是在派生类中找不到
t
之后通过基类中的名称查找找到的。在基类是依赖类型的情况下,或者在派生类中存在成员
T
时,这是相关的。