#include <cstdint>
class MyBar {};
class DifferentBar {};
class Foo{
public:
template <class Bar = MyBar>
Foo(uint32_t i) {}
};
int main() {
auto pFoo1 = new Foo(3);
auto pFoo2 = new Foo<DifferentBar>(3);
}
我试图理解为什么编译器给我一个错误:
template_ctor.cpp: In function ‘int main()’:
template_ctor.cpp:14:19: error: ‘Foo’ is not a template
auto pFoo2 = new Foo<DifferentBar>(3);
^~~
是因为模板参数的默认参数仅在类级别有效吗?当我更改为:
template <class Bar = MyBar>
class Foo{
public:
Foo(uint32_t i) {}
};
它会编译。
谢谢。
答案 0 :(得分:1)
写作时
class Foo{
public:
template <class Bar = MyBar>
Foo(uint32_t i) {}
};
您说Foo
是带有模板构造函数的非模板类。
写作时
auto pFoo2 = new Foo<DifferentBar>(3);
您给Foo
一个模板参数;但是Foo
是非模板类。
所以是错误。
使用默认参数模板在模板类中更改Foo
<class Bar = MyBar>
class Foo{
public:
Foo(uint32_t i) {}
};
您现在知道new Foo<DifferentBar>(3);
是正确的,并且还编译了new Foo(3);
,因为使用了默认模板参数(MyBar
)。