【问题标题】:What is the error in my shared_ptr declaration?我的 shared_ptr 声明中有什么错误?
【发布时间】:2014-05-28 14:45:40
【问题描述】:

我有一个班级持有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。

【问题讨论】:

  • 你用的是什么版本的visual studio?
  • Visual Studio 专业 2010。

标签: c++ boost shared-ptr


【解决方案1】:

您的代码中没有错误:这是(令人惊讶的)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 的身份提交此内容。

微软的回应:

我们同意编译器不允许使用这些特定标识符是不幸的,但由于架构原因,在我们当前的实现中修复此错误的成本过高。同时,请为您的变量使用其他名称来解决此问题。

【讨论】:

  • 我该死。谁会猜到?我将其更改为 _ssptr 并且编译时没有其他更改。
  • @RaydelMiranda 如果我知道 PolyMathic 是什么,我可能会推测它为什么能正常工作。
  • @Casey 我问他编译器的版本,他使用的是 Xcode,而不是 VS,这就是代码对他有用的原因。接得好!! +1
【解决方案2】:

来自 MSDN - Microsoft Compiler Error C2208

解析为类型名称的标识符在聚合声明中,但编译器无法声明成员。

以下示例生成 C2208:

// C2208.cpp
class C {
   C;   // C2208
   C(){}   // OK
};

尝试为MyClassImplMyClass添加一个默认构造函数。

【讨论】:

    【解决方案3】:

    我遇到了来自 MSVC 的“没有使用此类型定义的成员”的代码:

    Foo<Bar<Baz,int> qux; 
    

    通过确保每个尖括号都有一个配对来解决这个问题:

    Foo<Bar<Baz,int>> qux;
    

    不是提问者的情况,但我想我可以把它留在这里,以防其他聪明的人做我所做的事情。

    【讨论】:

      【解决方案4】:

      上面凯西的回答很好。下划线的问题是众所周知的。关于stackoverflow的讨论很多。例如,请参阅rules-about-using-an-underscore 了解非常复杂的细节。但是,paercebal 在该讨论中制定了非常好的和简单的“个人规则” (paercebal's answer):

      因为我不想办案子,想要一个简单的规则,所以我设计了一个既简单又正确的个人规则:

      在命名符号时,如果您:

      never start a symbol with an underscore
      
      never name a symbol with two consecutive underscores inside. 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-22
        • 2015-12-03
        • 2023-01-16
        • 2020-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多