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();