我创建了一个我需要帮助的场景。下面的代码是相同的示例测试应用程序。
#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编译器标志?
答案 0 :(得分:0)
[dcl.typedef] / P6
在给定范围内,typedef说明符不得用于重新定义在该范围内声明的任何类型的名称 范围指代不同的类型
GetInt
可能会在A
中定义,但基类中的typedef
会在解析scenario()
中的名称时发挥冲突(cfr。 [class.member.lookup] )因为这是一个不合格的查找。
此行为已定义并已预期。我不知道你可能用来实现目标的任何旗帜。要么像你已经发现的那样去寻找合格的名字,要么像约阿希姆指出的那样使用auto
类型演绎。