以下代码是否合法? 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
,它是它自己的同义词。
答案 0 :(得分:3)
Comeau认为你的代码不正确,所以我认为隐含类型解释的构造函数解释是标准强制要求 1 。
但是,如果您清除歧义并告诉编译器您正在尝试访问基类的derived
成员,那么您的代码会很乐意编译:
struct base
{
struct derived {};
};
struct derived : base {};
int main()
{
typedef derived::base::derived type;
return 0;
}
顺便说一句,构造函数解释占优势的事实是有道理的:你有一个众所周知的方法告诉编译器你想要引用基类的东西(通过范围解析运算符),但是你不会有一个语法来反向(强迫编译器理解你指的是构造函数)。因此,“默认构造函数”行为似乎非常明智。
答案 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;
}