c++ - C++ 对重载函数的引用不明确
问题描述
考虑以下 C++ 代码:
#include <vector>
struct A {
template<int Count, typename InputIt, typename OutputIt>
static OutputIt func(InputIt first, OutputIt result) {
// write some stuff to result...
return result;
}
};
template<typename Self>
struct Utils {
template<int Count, typename InputIt>
static std::vector<int> func(InputIt first) {
std::vector<int> vec;
Self::func<Count>(first, std::back_inserter(vec));
return vec;
}
};
struct C : A, Utils<C> {};
auto example(const char* ptr) {
return C::func<20>(ptr);
}
A
实现了一些功能func()
和Utils
一个辅助函数,简化了使用func()
相同名称但一个参数 less(!) 的使用。C
只是将这两者组合成一个结构。
现在,在里面example()
我想调用func()
定义在Utils
. 但是,gcc 失败并显示错误“对 'func' 的引用不明确”(clang 也失败并显示类似的错误消息)。我希望编译器能够选择正确的func()
,因为它们的参数数量不同。我在这里做错了什么?如何在不必重命名其中一个功能的情况下解决此问题?
谢谢!
解决方案
你这里有两个问题。首先,您需要func
从两个基类中显式提取标识符(由于多重继承而必需):
struct C : A, Utils<C> {
using A::func;
using Utils<C>::func;
};
接下来,您需要一个template
关键字 in Utils::func
;
static std::vector<int> func(InputIt first) {
std::vector<int> vec;
Self::template func<Count>(first, std::back_inserter(vec));
// ^^^^^^^^
return vec;
}
消除所需的模板实例化和另一个可能但奇怪的表达式之间的歧义(有关更多详细信息,请参见此处)。
推荐阅读
- php - 解析 PHP 当前用户更新失败但会话已更新
- tensorflow - TensorFlow - 在 fit_generator 中使用 class_weights 会导致内存泄漏
- android - android studio 3.4.3:无法解析依赖
- php - PHP将数据附加到xml文件
- python - 如何用openpyxl“格式化单元格”?
- python - 在将数据框中循环列表中的字符串与外部列表匹配到同一数据框中的新列后追加一个单词
- google-apps-script - 如何在已导入电子邮件后获取脚本以获取电子邮件?(忽略已被脚本调用的电子邮件)
- javascript - 如何将 javascript 表单中的变量传递给 python(在同一台计算机上)?
- android - Ionic Cordova 与 Cordova 命令的区别
- javascript - 如何随机选择三个图像,然后用新图像淡出它们?