gpt4 book ai didi

c++ - 使用模板类的函数重载

转载 作者:行者123 更新时间:2023-11-28 05:20:23 26 4
gpt4 key购买 nike

我在重载获取模板作为输入的函数时遇到问题。我做了一个模板 vector :

template TempVec<class T, int size>

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

我有一个名为 InnerProduct 的函数,它获取两个 vector 并返回 vector 之间的内积结果。问题在于返回值的类型取决于 vector 类型 (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 的 vector 或两个大小为 2 的 vector 。我试图得到摆脱了最后一个功能,但我得到了错误:

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

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

最佳答案

前 2 个重载永远不会(不显式),因为编译器无法推断大小,因此 SFINAE 启动并且重载是丢弃。

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

如果你删除第三个,你当然会得到一个编译器错误,因为如果你不自己指定一个 size 就不能选择前两个重载。

只需删除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);

关于c++ - 使用模板类的函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41650187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com