C++ 编译器在发生错误时的工作方式:参考‘;mytype’;含糊不清

C++ 编译器在发生错误时的工作方式:参考‘;mytype’;含糊不清,c++,typedef,multiple-inheritance,ambiguity,name-lookup,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

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

#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;
}
正如我们从代码中看到的,GetInt()仅在类A中定义,因此我认为mytype将仅从类A中获取。但根据错误日志,情况并非如此

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

A::mytype m=GetInt()

我想知道: 在这种情况下,编译器的行为如何? 在gcc的情况下,是否有ant编译器标志可以解决此错误?

[dcl.typedef]/p6

在给定范围内,不得使用typedef说明符重新定义该范围内声明的任何类型的名称 范围以引用其他类型

GetInt
可能在
A
中定义,但基类中的
typedef
s将在
scenario()
(cfr.[class.member.lookup])中解析名称时引发冲突,因为这是一个非限定查找


此行为是已定义和预期的。我不知道你会用什么旗帜来实现你的目标。或者按照您已经发现的方式进行限定名称查找,或者按照Joachim指出的那样使用
auto
类型推断。

您也可以使用
auto
进行类型推断,就像在
auto m=GetInt()中一样(如果您有一个处理C++11或更新版本的编译器)。@JoachimPileborg感谢您提供了另一种解决此问题的方法。
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();