定义类模板构造函数并提供模板参数

时间:2018-11-29 20:10:12

标签: c++

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

这与当前实例化的一部分有关吗?

1 个答案:

答案 0 :(得分:4)

每个类都有一个注入的类名,它是引用该类本身的成员typedef。对于非模板类Foo,注入的类名称也为Foo。对于Foo<T>(类模板Foo的特殊化),注入的类名称为Foo(即没有模板参数)。因此,在类Foo<T>中,名称FooFoo<T>都可以用来引用类Foo<T>本身。