我的shared_ptr声明中的错误是什么?

时间:2014-05-28 14:45:41

标签: c++ boost shared-ptr

我有一个类将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。

4 个答案:

答案 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
};

尝试将默认构造函数添加到MyClassImplMyClass

答案 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.