对于模板类Foo方法的参数,是“Foo&amp;”和“Foo <t>&amp;”相同?

时间:2016-08-10 08:00:12

标签: c++ templates

考虑班级

template <typename T>
struct Foo {
   Foo(const Foo<T>& other) {}
};

对于构造函数参数类型,const Foo<T>&const Foo&在此上下文中是否相同?我总是假设没有,认为后者可以被称为Foo<int> f = Foo<float>(),而前者则不能。但现在我不确定是不是这样。

2 个答案:

答案 0 :(得分:8)

在类模板中,类模板参数对每个实例都有一个独特的含义。这意味着Foo<int>T==int,因此模板化的ctor为Foo<int>::Foo(const Foo<int>& other)

但是可以使用其他模板参数:

template <typename T>
struct Foo {
   template <typename U>
   Foo(const Foo<U>& other) {}
};

现在T可能与U不同。

答案 1 :(得分:6)

是的,它是一样的。

这是由 inject-class-name 引起的。类名称将插入到所有类的范围中,以便名称查找能够合理地执行。当inject-name-name用作模板类中的类型名称时,它等同于模板名称,后跟<>[temp.local]/1)中包含的模板参数,因此{ {1}}相当于该上下文中的Foo