错误 C2327:不是类型名称、静态或枚举数

2024-01-01

我在 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;
};

这在 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

请帮忙。我对 Windows 缺少什么?


tl;dr:Visual Studio 是对的——你不能这么说typedef there.
Boost 文档明白这一点,但没有解释为什么 http://www.boost.org/doc/libs/1_54_0/doc/html/intrusive/usage.html#intrusive.usage.usage_member_hook.


[C++11: 14.3.2/1]: A 模板参数对于非类型、非模板模板参数应为 one of:

  • 对于非类型模板参数整型或枚举类型的转换后的常量表达式(5.19)模板参数; or
  • 非类型的名称模板参数; or
  • 常量表达式(5.19),指定具有静态存储持续时间和外部或内部链接的对象或具有外部或内部链接的函数的地址,包括函数模板和函数模板 ID但不包括非静态类成员,表示(忽略括号)为& id-expression,除了&如果名称引用函数或数组,则可以省略;如果对应的名称则应省略模板参数是一个参考;或者
  • 计算结果为空指针值的常量表达式 (4.10);或者
  • 计算结果为空成员指针值的常量表达式 (4.11);或者
  • 指向成员的指针,如 5.3.1 中所述表示.

[C++11: 5.3.1/3]:一元的结果&运算符是指向其操作数的指针。操作数应为左值或合格的 ID。如果操作数是合格的 ID命名非静态成员m某类的C与类型T,结果的类型为“指向类成员的指针”C类型的T” 并且是指定的纯右值C::m. [..]

[C++11: 8.3.3/2]给出了一个不完整类型的指向成员的指针的示例,只要该指向成员的指针未实际初始化,该指针就有效,尽管没有明确说明,但其含义是实际获取某个对象的地址C::m, C必须是一个完整的类型。确实,直到C是一个完整的类型,C::m并不真正存在。

有一些similar更清晰的规则:

[C++11: 9.2/10]:非静态(9.4)数据成员不得具有不完整的类型。特别是一类C不得包含类的非静态成员C,但它可以包含对类对象的指针或引用C.

在你的点typedef, Test不是一个完整的类型:

[C++11: 9.2/2]:类在结束时被视为完全定义的对象类型 (3.9)(或完整类型)} of the 类说明符。班级内会员规范,该类在函数体、默认参数内被认为是完整的,异常规范, and 大括号或等号初始化器对于非静态数据成员(包括嵌套类中的此类内容)。否则在自己的类中被认为是不完整的会员规范.

因此,您不能在该位置使用该指向成员的指针。您必须写下typedef以便它在关闭后出现}类定义的,或者使指向的对象成为非成员,或者static member.

GCC 必须有这方面的错误或扩展 http://ideone.com/zl3H8o,因为以下测试用例编译并成功执行:

template <typename B, int B::* PTM>
struct A {};
 
struct B
{
    int x;
 
    typedef A<B, &B::x> a;
};
 
int main() {
    B b;
}

而 Visual Studio 2012 Express 正确输出:

1>------ 构建开始:项目:test1,配置:调试 Win32 ------
1> 测试.cpp
1>f:\documents\visual studio 2012\projects\test1\test1\test.cpp(8): 错误 C2327: 'B::x' : 不是类型名称、静态或枚举器
1>f:\documents\visual studio 2012\projects\test1\test1\test.cpp(8): 错误 C2065: 'x': 未声明的标识符
1>f:\documents\visual studio 2012\projects\test1\test1\test.cpp(8): 错误 C2975: 'PTM' : 'A' 的模板参数无效,预期的编译时常量表达式
1> f:\documents\visual studio 2012\projects\test1\test1\test.cpp(1) :参见“PTM”的声明
========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误 C2327:不是类型名称、静态或枚举数 的相关文章

  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐