如果出现错误,编译器如何工作:对'mytype'的引用是不明确的

时间:2015-12-02 06:43:16

标签: c++ typedef multiple-inheritance ambiguity name-lookup

我创建了一个我需要帮助的场景。下面的代码是相同的示例测试应用程序。

#include <iostream>

using namespace std;

class A
{
public:
    typedef int mytype;
    mytype GetInt() { return 1;}
};

class B
{
public:
    typedef char mytype;
};

class C : public A, public B
{
};

class D : public C
{
public:
    void scenario()
    {
        mytype m = GetInt();
    }
};

int main()
{
    D d1;
    d1.scenario();

    return 0;
}

使用以下代码编译代码:g ++ tmp.cpp

Error:
tmp.cpp:27:9: error: reference to ‘mytype’ is ambiguous
         mytype m = GetInt();
         ^
tmp.cpp:15:18: note: candidates are: typedef char B::mytype
     typedef char mytype;
                  ^
tmp.cpp:8:17: note:                 typedef int A::mytype
     typedef int mytype;
                 ^
tmp.cpp:27:16: error: expected ‘;’ before ‘m’
         mytype m = GetInt();

正如我们从代码中可以看到,GetInt()仅在类A中定义,所以我虽然mytype只取自A类。但根据错误日志情况并非如此。

我们可以通过添加类A的范围来解决这个问题,如

  

A :: mytype m = GetInt();

我想知道: 编译器在这种情况下的表现如何? 是否存在将在gcc情况下解决此错误的ant编译器标志?

1 个答案:

答案 0 :(得分:0)

[dcl.typedef] / P6

  

在给定范围内,typedef说明符不得用于重新定义在该范围内声明的任何类型的名称   范围指代不同的类型

GetInt可能会在A中定义,但基类中的typedef会在解析scenario()中的名称时发挥冲突(cfr。 [class.member.lookup] )因为这是一个不合格的查找。

此行为已定义并已预期。我不知道你可能用来实现目标的任何旗帜。要么像你已经发现的那样去寻找合格的名字,要么像约阿希姆指出的那样使用auto类型演绎。