Template类非模板化方法参数

时间:2013-07-29 23:40:01

标签: c++ class templates template-classes

我有一个使用模板的类。它是这样的:

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 个答案:

答案 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,但在您的情况下,它不会编译,因为floatint的常见类型为float

a<float> x = a<int>(1) + a<float>(8)

应该适用于那种情况