考虑以下 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);
}
godbolt.org linkA
实现一些功能func()
和 Utils
一个帮助函数,简化了 func()
的使用同名但少一个参数(!)。 C
只是将这两者组合成一个结构。现在,在
example()
里面我想调用func()
定义于 Utils
.但是,gcc 失败并显示错误“对 'func' 的引用不明确”(clang 也失败并显示类似的错误消息)。我希望编译器能够选择正确的 func()
因为它们的参数数量不同。我在这里做错了什么?如何在不必重命名其中一个功能的情况下解决此问题?谢谢!
最佳答案
你这里有两个问题。首先,您需要明确地拉入 func
来自两个基类的标识符(由于多重继承而必需):
struct C : A, Utils<C> {
using A::func;
using Utils<C>::func;
};
接下来,您需要一个 template
Utils::func
中的关键字;static std::vector<int> func(InputIt first) {
std::vector<int> vec;
Self::template func<Count>(first, std::back_inserter(vec));
// ^^^^^^^^
return vec;
}
以消除所需的模板实例化和另一个可能但奇怪的表达式之间的歧义(参见 here 了解更多详细信息)。
关于C++ 对重载函数的引用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63087990/