我有一个类将shared_ptr
保存到另一个类。我收到shared_ptr
声明的编译错误,声明"没有使用此类型定义的成员。"我复制此代码的代码非常简短:
#include <iostream>
#include <boost/shared_ptr.hpp>
class MyClassImpl
{
};
class MyClass
{
public:
boost::shared_ptr<MyClassImpl> _sptr;
//error C2208: 'boost::shared_ptr<T>' : no members defined using this type
};
int main()
{
MyClass mc;
return 0;
}
我在这里做错了什么?我是使用Boost 1.54的Visual Studio Professional 2010。
答案 0 :(得分:9)
您的代码中没有错误:它是(惊讶)Microsoft编译器中的错误。显然_sptr
是某种神奇的标识符。更改名称,它将正确编译(Live at Rextester)。
这是minimal example that shows the problem:
struct A {
int _sptr;
};
int main()
{}
This answer意味着_sptr
和_uptr
在Visual C ++中都有这种效果,我无法找到权威来源。
Microsoft 执行文档an extension that implements modifiers __sptr
and __uptr
,在将32位指针类型转换为64位指针类型时执行一些魔术。我假设编译器将_sptr
和_uptr
视为与__sptr
和__uptr
相同。我已在Connect Bug# 882592上提交了此内容。
微软的回应:
我们同意编译器不允许使用这些特定标识符是不幸的,但由于架构原因,在我们当前的实现中修复此错误是成本过高的。在此期间,请使用变量的其他名称来解决此问题。
答案 1 :(得分:0)
来自MSDN - Microsoft Compiler Error C2208:
解析为类型名称的标识符在聚合声明中,但编译器不能声明成员。
以下示例生成C2208:
// C2208.cpp
class C {
C; // C2208
C(){} // OK
};
尝试将默认构造函数添加到MyClassImpl
和MyClass
。
答案 2 :(得分:0)
我遇到了来自MSVC的“没有使用此类型定义的成员”代码:
Foo<Bar<Baz,int> qux;
通过确保每个尖括号都有一个配合来解决这个问题:
Foo<Bar<Baz,int>> qux;
不是提问者的情况,但我想我可能会留在这里,以防其他有才华的人做我做的事。
答案 3 :(得分:0)
以上凯西的回答很好。下划线的问题是众所周知的。有关stackoverflow的讨论很多。例如,请参阅rules-about-using-an-underscore有关详细信息,这些内容非常复杂。但是在讨论中{<{> 3}}, paercebal 制定了非常简单的“个人规则”:
因为我不想处理案件,并且想要一个简单的规则,所以我设计了一个既简单又正确的个人:
在命名符号时,如果您:
,将避免与编译器/ OS /标准库冲突never start a symbol with an underscore never name a symbol with two consecutive underscores inside.