模板类非模板化方法参数

Template class non-templated method argument

本文关键字:方法 参数      更新时间:2023-10-16

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

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);。我说得对吗?

在您的类模板中,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)

应该在这种情况下工作