我有一个使用模板的类。它是这样的:
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);
。我是对的吗?
答案 0 :(得分:2)
在您的课程模板中,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)
应该适用于那种情况