考虑以下 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()
的使用,具有相同的名称但比其少一个参数。 C
将这两个结合成一个结构体。
现在,在 example()
中,我想调用在 Utils
中定义的 func()
。 但是,gcc 出错并显示“对 'func' 的引用不明确”(clang 也出错并显示类似的错误消息)。 我期望编译器能够选择正确的 func()
,因为它们在参数数量上有所不同。 我在这里做错了什么? 如何修复此问题,而无需重命名其中一个函数?
谢谢!
func
名称查找背后。如果您手动将所有基类func
名称引入C
中(即struct C:A,Utils <C> {using A :: func; using Utils <C> :: func;};
),则会发现您尝试在定义C
(又名Self
)时解决Self :: func
。使用A :: func <Count>(...)
可以解决问题,但这显然违背了编译器选择正确重载的想法。 - lubgrstruct C : A, Utils<A> {}
(注意此时 Self 是 A),即使 A 在这个点已经被定义了,错误信息仍然是相同的。 - shilch