具有多重继承的operator()的模糊定义

mat*_*ati 8 c++ inheritance operator-overloading

我用GCC编译这段代码(4.2.1 Apple build 5664)

#include <cstddef>

using std::size_t;

template <char I> struct index { };

struct a
{
    void operator()(size_t const &) { }
};

struct b
{
    template <char I>
    void operator()(index<I> const &) { }
};

struct c: public a, public b { };

int main (int argc, char const *argv[])
{
    c vc;
    vc(1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并给我以下错误:

main.cpp: In function ‘int main(int, const char**)’:
main.cpp:22: error: request for member ‘operator()’ is ambiguous
main.cpp:14: error: candidates are: template<char I> void b::operator()(const index<I>&)
main.cpp:9:  error:                 void a::operator()(const size_t&)
Run Code Online (Sandbox Code Playgroud)

我不明白这个代码含糊不清的原因; 这两种方法有不同的签名.

peo*_*oro 6

修改c这种方式:

struct c: public a, public b
{
    using a::operator();
    using b::operator();
};
Run Code Online (Sandbox Code Playgroud)

C++(在C++ 0x之前)在继承函数方面有点尴尬:如果你提供一个与基类同名的函数,它会隐藏基类函数.

它看起来也继承了两个类有同样的问题.

//寻找标准......

  • @Zac Howland:隐藏发生在名字匹配而非签名上. (5认同)

Eug*_*nca 6

名称解析在重载解析之前完成.
没有operator(),c所以编译器会operator()在它的基类中查找并找到一个a和另一个b使名称不明确(并且不会发生重载决策).

如果要消除名称歧义,可以a::operator()明确调用:vc.a::operator()(1);