C ++似乎不在乎是否为类模板的构造函数提供模板参数。这是一个示例:
template<typename T>
class Foo
{
Foo() { /* ... */ } // OK
Foo<T> { /* ... */ } // Also OK
}
这两个构造函数定义之间有区别吗?另外,在提供模板参数的主题中,当声明位于同一类内部时,为什么不必须为类模板参数提供参数呢?下面的示例:
template<typename T>
class Foo
{
Foo(const Foo& other) { /* ... */ } // OK
Foo(const Foo<T>& other) { /* ... */ } // Also OK
void Foobar(const Foo& foo) { /* ... */ } // Still OK
};
// Somewhere outside Foo...
void Foobar(const Foo& foo) { /* ... */ } // Not OK
这与当前实例化的一部分有关吗?
答案 0 :(得分:4)
每个类都有一个注入的类名,它是引用该类本身的成员typedef。对于非模板类Foo
,注入的类名称也为Foo
。对于Foo<T>
(类模板Foo
的特殊化),注入的类名称为Foo
(即没有模板参数)。因此,在类Foo<T>
中,名称Foo
和Foo<T>
都可以用来引用类Foo<T>
本身。