模板类非模板化方法参数

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&lt;T&gt; func(a arg); 解释为a&lt;T&gt; func(a&lt;T&gt; arg);。我说的对吗?

【问题讨论】:

【参考方案1】:

在您的课程模板中a 表示a&lt;All the tempalte args here&gt;a&lt;T&gt;

所以你的两个功能都是一样的。

如果你想提供另一种类型,你应该使用模板函数

template <typename T> 
class a 
    template<typename U>
    a<T> func(a<U> arg);

您也可以考虑返回std::common_type&lt;T, U&gt;::type,但在您的情况下它不会编译,因为floatint 的常见类型是float

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

应该在这种情况下工作

【讨论】:

以上是关于模板类非模板化方法参数的主要内容,如果未能解决你的问题,请参考以下文章

使用gprof显示模板化方法的调用图的参数格式?

不使用模板参数的 C++ 模板类方法

带有 lambda 作为每个实例化的唯一默认参数的模板

在不知道其模板参数的情况下将类模板声明为朋友的最佳方法

C++模板进阶

C++模板进阶