C++ 对重载函数的引用不明确

标签 c++ templates inheritance overloading

考虑以下 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/

相关文章:

c++ - 测试无效的窗口句柄 : should I compare with 'NULL' , '0' 甚至 'nullptr' ?

c++ - 将大括号作为函数参数传递意味着什么?

c++ - C++11 中由 std::tuple_size 终止的递归可变参数模板

c++ - 有没有办法调用模板参数类的未知方法?

带有 setter 方法的 JavaScript 属性不是真正的属性?

c++ - GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?

c++ - 如何使用 DW2 构建定制的 MinGW 交叉编译器

c++ - 如何用顶级 const 解决这个问题?

javascript - 从 JavaScript 访问 List 类的扩展属性

java - 继承和递归