考虑以下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链接
a
实现了一些功能func()
,而则使用了一个帮助器函数,该函数简化了具有相同名称但少一个参数(!)的
func()
的使用。 C
只是将这两个组合成一个结构。
现在,在example()
内部,我想调用utils
中定义的func()
。 但是,gcc失败时出现错误“reference to'func'is ambiguous”(clang也失败时出现类似的错误消息)。 我希望编译器能够选择正确的func()
,因为它们的参数数量不同。 我在这里做错了什么? 如何在不重命名其中一个函数的情况下修复此问题?
谢啦!
你有两个问题。 首先,您需要从两个基类显式地拉入func
标识符(由于多重继承,这是必需的):
struct C : A, Utils<C> {
using A::func;
using Utils<C>::func;
};
接下来,您需要utils::func
中的template
关键字;
static std::vector<int> func(InputIt first) {
std::vector<int> vec;
Self::template func<Count>(first, std::back_inserter(vec));
// ^^^^^^^^
return vec;
}
以消除所需模板实例化和另一个可能但奇怪的表达式之间的歧义(请参阅此处以获得更多详细信息)。