【问题标题】:Simple boost smart pointer syntax issue简单的 boost 智能指针语法问题
【发布时间】:2012-05-06 18:39:12
【问题描述】:

使用boost::scoped_ptrboost::shared_ptr 时出现错误

1>*\algomanager.cpp(28) : 错误 C2064: 术语不计算为 函数接受 1 个参数

我有这样的代码。 . .

class X{
  boost::shared_ptr<cPreFilterProcess> preProcess;
public:
  X(){
    preProcess(new cPreFilterProcess(pars));
  }
};

我错过了什么?谢谢。

【问题讨论】:

  • 显示类的完整构造函数。
  • 你的意思是:boost::shared_ptr&lt;cPreFilterProcess&gt; preProcess(new ....) 不起作用?
  • boost::shared_ptr&lt;cPreFilterProcess&gt; preProcess ( new cPreFilterProcess(pars) ); 确实有效,但我希望 preProcess 出现在类定义中,以便它与拥有对象的生命周期相关联。
  • 那时您可能应该展示一个完整的代码示例,这样人们就不必猜测您的意思,Xeo 也不必耗尽神秘的魔法调试玻璃球上的电池。

标签: c++ boost shared-ptr smart-pointers


【解决方案1】:

我神秘的魔法调试玻璃球告诉我你正在做这样的事情:

class X{
  boost::shared_ptr<cPreFilterProcess> preProcess;
public:
  X(){
    preProcess(new cPreFilterProcess(pars));
  }
};

您需要使用以下任一成员初始化器:

X() : preProcess(...){}

或者使用.reset,因为你不能只分配这样的指针:

X() { preProcess.reset(...); }

我强烈推荐第一个选项。

【讨论】:

  • 那是一个强大的球体!我已经相应地更新了我的问题。谢谢。
  • 太棒了,这两个都有效。为什么更强烈推荐第一个选项?
  • @learnvst:因为第二个选项基本都是X() : preProcess() { preProcess.reset(...); },也就是默认初始化然后重置shared_ptr
  • 那么第一个选项可以防止浪费的初始化?
  • @learnvst:正确。你可以搜索一下,有几个主题。
【解决方案2】:

如果你只是把它写成一个声明:

preProcess ( new cPreFilterProcess(pars) );

它是无效的,因为preProcess 已经构造好了,所以语法会尝试像函数一样“调用”它。

这也是无效的:

preProcess = new cPreFilterProcess(pars);

因为您不能将cPreFilterProcess* 分配给shared_ptr&lt;cPreFilterProcess&gt;

也许你的意思是:

preProcess.reset( new cPreFilterProcess(pars) );

preProcess = boost::shared_ptr<cPreFilterProcess>( new cPreFilterProcess(pars) );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多