2
typedef int abc;

class Some{
   public:
      abc foo(){...}
      typedef double abc;
};

在上面的代码中,我得到一个错误:

error: changes meaning of 'abc' from 'typedef int abc'

因为在c++ Primer,fifth edtion一书中,它说:

类定义分两个阶段处理:

1.首先编译成员声明。

2.函数体只有在看到整个类之后才编译。

但是在这里的代码中:

typedef int abc;

class Some{
     public:
        int foo(abc){...}
        typedef double abc;
};

abc在参数列表中设置。但我没有得到那种错误,编译器工作得很好。为什么后面的代码不会给我任何类似于前者的错误?

4

4 回答 4

1

我不认为有任何理由。此错误不需要诊断(根据标准 C++),因此当您的代码中有此错误时,行为实际上是未定义的。

你的编译器只是没有检查这个错误的参数列表,但很可能已经完成了。

于 2013-05-09T23:26:43.997 回答
0

您需要对其进行限定Some::abc

typedef int abc;

class Some{
   public:
      Some::abc foo(){...}
      typedef double abc;
};
于 2013-03-20T13:52:14.367 回答
0

第一个示例给出错误的原因是名称查找没有考虑返回类型。但是,当在调用它的表达式中生成实际的函数体时,编译器将使用Some::abc并找到差异。

typedef int abc;

class Some{
   public:
      abc foo() { return abc(); }  // during lookup/resolution, "abc" is known to be int, return type is not considered
      typedef double abc;
};

int main() 
{ 
    Some s; 
    int x = s.foo(); // kaboom, return type is double.
}

在您的第二个示例中,类型重新定义无关紧要,因为在名称查找期间,abc已知它是一个 int,因为尚未看到内部 typedef 的定义。在调用点实例化函数期间没有任何后果,因为返回类型也是 int。根本没有不匹配。

typedef int abc;

class Some{
   public:
      int foo(abc) { return int(); }  // during lookup/resolution, "abc" is known to be int
      typedef double abc;             // this will not have been seen yet in the previous line
};

int main() 
{ 
    Some s; 
    int x = 0;
    s.foo(x); // OK, x is of type int
}
于 2013-05-09T22:38:20.910 回答
0

在 MinGW 中,如果成员函数的返回类型显示为 typedef 声明定义的别名类型。不允许改变其含义。您要求的名称查找规则仍然像 Lippman 的 C++ Primer 第 447 页中介绍的一样有效——类成员声明的名称查找。

  1. 考虑使用名称之前出现的类成员的声明。
  2. 如果步骤 1 中的查找不成功,则考虑出现在定义类的范围内以及出现在类定义本身之前的声明。
于 2014-01-20T07:35:13.233 回答