模板类构造函数语法限制:为何类外定义存在特殊约束?
模板类构造/析构函数的定义语法限制疑问
定义模板类时,构造函数和析构函数有两种合法写法(一种尽量少用<T>,一种尽量多用<T>):
第一种写法:
template <typename T> class Foo { public: Foo(){} Foo(Foo const&){} ~Foo(){} };
第二种写法:
template <typename T> class Foo { public: Foo<T>(){} Foo<T>(Foo<T> const&){} ~Foo<T>(){} };
在类外定义成员函数时,也有两种合法写法:
第一种类外定义:
template <typename T> Foo<T>::Foo() {} template <typename T> Foo<T>::Foo(Foo const&) {} template <typename T> Foo<T>::~Foo() {}
第二种类外定义:
template <typename T> Foo<T>::Foo() {} template <typename T> Foo<T>::Foo(Foo<T> const&) {} template <typename T> Foo<T>::~Foo<T>() {} // 没错,这种写法也是合法的
但以下写法是非法的:
template <typename T> Foo<T>::Foo<T>() {} template <typename T> Foo<T>::Foo<T>(Foo<T> const&) {}
GCC 13.2会报出如下错误:
error: 'Foo
::Foo' names the constructor, not the type
error: and 'Foo' has no template constructors
我无法理解该限制的原因,为何仅针对类外定义存在此约束?
内容的提问来源于stack exchange,提问作者Caduchon
相关产品推荐
相关产品推荐

