对于模板类Foo的方法参数,"Foo&"和"Foo<T>&"是相同的吗?

4

考虑这个类

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

对于构造函数参数类型,在这个上下文中,const Foo<T>&const Foo&是一样的吗?我一直以为不是,认为后者可以用于Foo<int> f = Foo<float>(),而前者不能。但现在我不确定是否如此。


1
可能是 省略 C++ 模板参数列表时的差异 的重复问题。 - LogicStuff
正如其他答案所说,是的,这是合法的。这并不含糊,因为你不能同时拥有class Fooclass Foo<T> - peterchen
2个回答

8

在类模板中,每个实例化都有唯一的意义。这意味着Foo<int>具有T==int,因此模板构造函数为Foo<int>::Foo(const Foo<int>& other)

但是,可以有额外的模板参数:

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

现在的 T 可以和 U 不同。

6

是的,它们是相同的。

这是由于“injected-class-name”(注入类名)所致。该类名被插入到所有类的范围内,以使名称查找行为明智。当在模板类中使用注入类名作为类型名时,它等效于模板名称后跟用<>括起来的模板参数([temp.local]/1),因此在这种情况下,Foo 等价于 Foo<T>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接