派生类型可以与其基类的嵌套类型相同吗?

时间:2011-12-06 23:55:47

标签: c++

以下代码是否合法? MSVC 9和g ++ 4.4不同意:

struct base
{
  struct derived {};
};

struct derived : base {};

int main()
{
  typedef derived::derived type;
  return 0;
}

MSVC抱怨,混淆了类型构造函数的嵌套名称:

c:\dev>cl test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
test.cpp(10) : error C2146: syntax error : missing ';' before identifier 'type'
test.cpp(10) : error C2761: '{ctor}' : member function redeclaration not allowed

test.cpp(10) : error C2065: 'type' : undeclared identifier

虽然g ++没有:

$ g++ --version test.cpp
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

对于上下文,我的代码包含一个名为pointer的迭代器。为了提供迭代器接口,它提供了嵌套类型pointer,它是它自己的同义词。

2 个答案:

答案 0 :(得分:3)

Comeau认为你的代码不正确,所以我认为隐含类型解释的构造函数解释是标准强制要求 1

但是,如果您清除歧义并告诉编译器您正在尝试访问基类的derived成员,那么您的代码会很乐意编译:

struct base
{
  struct derived {};
};

struct derived : base {};

int main()
{
  typedef derived::base::derived type;
  return 0;
}

顺便说一句,构造函数解释占优势的事实是有道理的:你有一个众所周知的方法告诉编译器你想要引用基类的东西(通过范围解析运算符),但是你不会有一个语法来反向(强迫编译器理解你指的是构造函数)。因此,“默认构造函数”行为似乎非常明智。


  1. 我可能会稍后查一下,但我不保证我真的会这样,这种讨厌的名字问题一直都是乱七八糟的。

答案 1 :(得分:0)

你所拥有的是名称中的冲突。 只需将第二个结构重命名为struct derived2。 并在main()中执行此更改:typedef derived2::derived type; 它在VC ++ 6.0中编译时没有错误

struct base
{
  struct derived {};
};

struct derived2 : base {};


int main()
{
  typedef derived2::derived type;
  return 0;
}