模板类非模板化方法参数
Posted
技术标签:
【中文标题】模板类非模板化方法参数【英文标题】:Template class non-templated method argument 【发布时间】:2013-07-29 23:40:01 【问题描述】:我有一个使用模板的类。是这样的:
template <typename T>
class a
public:
a(T arg);
a<T> func(a arg); // This seems to work, but...
a<T> func(a<T> arg); // ...should I be doing this instead?
private:
T local;
;
注意func
的两个函数模板。两者都会编译(当然,不是同时),但哪一个是正确的,或者没关系?首先,我已经指定 class a
是参数...在第一种情况下,可以使用不同的类型代替 T... 例如我可以这样做:
a<float> b;
a<int> c;
a<int> d;
d = c+ b;
我猜答案是“否”,因为它无法编译!
在第二种情况下,很明显参数必须具有相同的模板化类型。
由于我上面讨论的内容,我猜测编译器实际上将a<T> func(a arg);
解释为a<T> func(a<T> arg);
。我说的对吗?
【问题讨论】:
【参考方案1】:在您的课程模板中a
表示a<All the tempalte args here>
即a<T>
所以你的两个功能都是一样的。
如果你想提供另一种类型,你应该使用模板函数
template <typename T>
class a
template<typename U>
a<T> func(a<U> arg);
您也可以考虑返回std::common_type<T, U>::type
,但在您的情况下它不会编译,因为float
和int
的常见类型是float
a<float> x = a<int>(1) + a<float>(8)
应该在这种情况下工作
【讨论】:
以上是关于模板类非模板化方法参数的主要内容,如果未能解决你的问题,请参考以下文章