Abh*_*bhi 5 c++ windows templates g++ visual-studio
我在Windows上面临"错误C2327".
我减少了我的代码,并在测试程序中遇到类似的错误
#include <boost/intrusive/list.hpp>
#include <iostream>
class Test {
protected:
typedef Test self_type;
boost::intrusive::list_member_hook<> order_hook;
public:
typedef boost::intrusive::member_hook<self_type,
boost::intrusive::list_member_hook<>,
& Test::order_hook > order_hook_type;
};
Run Code Online (Sandbox Code Playgroud)
这在g ++上工作正常但在Windows上却出现以下错误:
test.cpp(11) : error C2327: 'Test::order_hook' : is not a type name, static, or enumerator
test.cpp(11) : error C2065: 'order_hook' : undeclared identifier
Run Code Online (Sandbox Code Playgroud)
请帮忙.我错过了什么窗户?
tl;dr:Visual Studio 是对的 \xe2\x80\x94 你不能把它放在typedef那里。
\nBoost 文档对此是正确的,但没有解释原因。
\n\n\n
[C++11: 14.3.2/1]:非类型、非模板模板参数的模板参数应为以下之一:\n
\n- 对于整型或枚举类型的非类型模板参数,模板参数类型的转换常量表达式(5.19);或者
\n- 非类型模板参数的名称;或者
\n- 常量表达式(5.19),指定具有静态存储持续时间和外部或内部链接的对象的地址或具有外部或内部链接的函数的地址,包括函数模板和函数模板ID,但不包括非静态类成员,表示(忽略括号)as
\n& id-expression,但&如果名称引用函数或数组,则可以省略 ;如果相应的模板参数是引用,则应省略;或者- 计算结果为空指针值的常量表达式 (4.10);或者
\n- 计算结果为空成员指针值的常量表达式 (4.11);或者
\n- 指向成员的指针,如 5.3.1 中所述表示。
\n\n
[C++11: 5.3.1/3]:一元运算符的结果&是指向其操作数的指针。操作数应为左值或限定 ID。如果操作数是命名某个类型为 的类的非静态成员的限定 ID,则结果类型为 \xe2\x80\x9c,指向类型为 \xe2\x80\x9d 的类的成员的指针,并且是指定 的纯右值。[..]mCTCTC::m
[C++11: 8.3.3/2]给出了一个不完整类型的指向成员的指针的示例,只要该指向成员的指针未实际初始化,该指针就有效,尽管没有明确说明,但含义是要实际获取 some 的地址C::m,C必须是一个完整的类型。事实上,untilC是一个完整的类型,C::m并不真正存在。
还有一些类似的规则更清晰:
\n\n\n\n
[C++11: 9.2/10]:非静态(9.4)数据成员不得具有不完整的类型。特别是,类C不应包含 class 的非静态成员C,但它可以包含对 class 的对象的指针或引用C。
在你的点上typedef,Test不是一个完整的类型:
\n\n\n
[C++11: 9.2/2]:在类说明符}结束时,类被视为完全定义的对象类型 (3.9)(或完整类型)。在类成员规范中,该类在函数体、默认参数、异常规范和非静态数据成员的大括号或等于初始化器(包括嵌套类中的此类内容)中被视为完整。否则,它在其自己的类成员规范中被视为不完整。
因此,您不能在该位置使用该指向成员的指针。您必须编写 ,typedef使其出现在}类定义结束之后,或者使指向的对象成为非成员或static成员。
GCC在这方面一定有 bug 或扩展,因为以下测试用例编译并成功执行:
\ntemplate <typename B, int B::* PTM>\nstruct A {};\n \nstruct B\n{\n int x;\n \n typedef A<B, &B::x> a;\n};\n \nint main() {\n B b;\n}\nRun Code Online (Sandbox Code Playgroud)\n而 Visual Studio 2012 Express 正确输出:
\n\n\n1>------ 构建开始:项目:test1,配置:调试 Win32 ------
\n
\n1> test.cpp
\n1>f:\\documents\\visual studio 2012\\projects\\test1 \\test1\\test.cpp(8): 错误 C2327: \'B::x\' : 不是类型名称、静态或枚举器
\n1>f:\\documents\\visual studio 2012\\projects \\test1\\test1\\test.cpp(8): 错误 C2065: \'x\' : 未声明的标识符
\n1>f:\\documents\\visual studio 2012\\projects\\test1\\test1\\ test.cpp(8): 错误 C2975: \'PTM\' : \'A\' 的模板参数无效,预期编译时常量表达式
\n1> f:\\documents\\visual studio 2012\\projects\\ test1\\test1\\test.cpp(1) :参见 \'PTM\' 的声明
\n========== 构建:0 成功,1 失败,0 最新,0 跳过=========
| 归档时间: |
|
| 查看次数: |
3023 次 |
| 最近记录: |