我在重载一个将模板作为输入的函数时出现问题。 我做了一个模板矢量:
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.
我非常感谢对此问题的一些解释/解决方案。
答案 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);