【发布时间】:2020-07-25 11:52:14
【问题描述】:
考虑以下 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>(...)它可以工作,但这显然违背了编译器选择正确重载的想法。 -
嗯,如果我改写
struct C : A, Utils<A> {}(注意Self现在是A),即使此时定义了A,错误消息仍然相同。
标签: c++ templates inheritance overloading