【问题标题】:How compiler works in case of error: reference to ‘mytype’ is ambiguous发生错误时编译器如何工作:对“mytype”的引用不明确
【发布时间】:2015-12-02 06:43:15
【问题描述】:

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

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

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

【问题讨论】:

  • 您也可以使用 auto 的类型推导,如 auto m = GetInt(); (如果您有处理 C++11 或更高版本的编译器)。
  • @JoachimPileborg 感谢您提供解决此问题的另一种方法。

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


【解决方案1】:

[dcl.typedef]/p6

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

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

此行为是已定义和预期的。我不知道您可能使用任何标志来实现您的目标。要么按照您已经发现的那样进行限定名称查找,要么按照 Joachim 指出的那样使用 auto 类型推导。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    相关资源
    最近更新 更多