使用模板类重载函数

时间:2017-01-14 12:53:59

标签: c++ templates overloading

我在重载一个将模板作为输入的函数时出现问题。 我做了一个模板矢量:

template TempVec<class T, int size>

有两个选项:int大小为3的向量,或大小为2的复数向量。

我有一个名为InnerProduct的函数,它获取两个向量并返回向量之间的内积的结果。问题是返回值的类型取决于向量类型(int / complex)。

所以我创建了这三个函数(在TempVec类中):

template <class T, int size>
    friend int InnerProduct(const TempVec<T, 3>& v1, const TempVec<T, 3>& v2);

template <class T, int size>
    friend complex InnerProduct(const TempVec<T, 2>& v1, const TempVec<T, 2>& v2);

template <class T, int size>
    friend TempVec<T, size> InnerProduct(const TempVec<T, size>& v1, const TempVec<T, size>& v2); 

当我调用InnerProduct时,我总是到达最后一个函数(最常用的函数),即使我传递了两个大小为3的向量,或者两个大小为2的向量。我试图摆脱它最后一个功能,但我得到了错误:

'InnerProduct': none of the 2 overloads could convert all the argument types.

我非常感谢对此问题的一些解释/解决方案。

1 个答案:

答案 0 :(得分:1)

前两次重载永远永远不会被采用(没有明确),因为编译器无法推断size,因此SFINAE会启动并且丢弃重载。< / p>

编译器无法推导size,因为您从未在函数签名中指定它。 size在2个重载可能(我不知道正文)中是完全冗余的,但编译器必须初始化它。因为它无法从签名中推断出来,所以您必须自己指定它。如果你不这样做,他们永远不会被选中。

如果删除第三个,当然会出现编译错误,因为如果您自己未指定size,则无法选择前2个重载。

只需删除size,您就不需要它了:

template <class T>
    friend int InnerProduct(const TempVec<T, 3>& v1, const TempVec<T, 3>& v2);

template <class T>
    friend complex InnerProduct(const TempVec<T, 2>& v1, const TempVec<T, 2>& v2);