提问者:小点点

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


考虑以下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(),因为它们的参数数量不同。 我在这里做错了什么? 如何在不重命名其中一个函数的情况下修复此问题?

谢啦!


共1个答案

匿名用户

你有两个问题。 首先,您需要从两个基类显式地拉入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;
}

以消除所需模板实例化和另一个可能但奇怪的表达式之间的歧义(请参阅此处以获得更多详细信息)。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|重载|函数|引用|不明确)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?