【问题标题】:vs2010 build error with BOOST_MOVABLE_BUT_NOT_COPYABLE带有 BOOST_MOVABLE_BUT_NOT_COPYABLE 的 vs2010 构建错误
【发布时间】:2014-08-26 09:08:22
【问题描述】:

以下是简化代码:

-------------class foo------------------------

class foo : private boost::noncopyable      //--- mark 1---
{
    BOOST_MOVABLE_BUT_NOT_COPYABLE(foo)     //--- mark 2---

public:

    /**
     * Move constructor.
     */
    foo(BOOST_RV_REF(foo) other);

    /**
     * Move-assignment.
     */
    foo& operator=(BOOST_RV_REF(foo) other);

    /**
     * Releases
     */
    ~foo();
    ......
private:
    fool_impl*  m_pimpl;
}

foo::foo(foo_impl* pimpl)
:m_pimpl(pimpl) 
{}

foo::foo(
    BOOST_RV_REF(foo) other) : m_pimpl(other.m_pimpl)
{
    other.m_pimpl = NULL;
}

foo& foo::operator=(
    BOOST_RV_REF(foo) other)
{
    if (&other != this)
    {
        delete m_pimpl;
        m_pimpl = other.m_pimpl;
        other.m_pimpl = NULL;
    }

    return *this;
}

foo::~foo()
{
    delete m_pimpl;
}

---------------班级栏-----------

class bar
{
public:

    explicit bar(BOOST_RV_REF(foo) other);

    ......

private:

    foo m_foo;
};

bar::bar(BOOST_RV_REF(foo) other)
:
m_foo(other)                        //--- mark 3----
{}

用VS2010构建时,mark 3报错:

错误 C2248:“foo”:无法访问在“foo”类中声明的私有成员 1> 标记 1:见 'foo' 的声明 1> 标记 2:见 'foo' 的声明

我试图修改一些代码,但没有用。 任何人都可以提供任何建议吗?谢谢。


@Piotr S。 感谢您的回答,我试过了,错误消失了,但是又出现了一个错误:

class test
{
public:

    explicit test(
        BOOST_RV_REF(foo) other);

private:
    boost::shared_ptr<aClass> m_class;
};

test::test(BOOST_RV_REF(foo) other)
{
    m_class = boost::make_shared<aClass>(boost::ref(other));
}

错误 LNK2019:未解析的外部符号“private: __cdecl foo(class foo const &)”在函数“class boost::shared_ptr __cdecl boost::make_shared const >(class boost::reference_wrapper const &&)”中引用

你能给点建议吗?谢谢!

【问题讨论】:

  • 我从未使用过 Boost.Move,但我猜 BOOST_MOVABLE_BUT_NOT_COPYABLE 并非设计用于与 boost::noncopyable 一起使用。
  • 错误消息不完整 - 您没有显示错误是 哪个 私人成员。
  • 我解决了这个问题:将 boost::ref 替换为 boost::move。

标签: c++ visual-studio-2010 boost move


【解决方案1】:

你需要使用boost::move():

bar::bar(BOOST_RV_REF(foo) other)
:
    m_foo(boost::move(other)) // move it !
{}

否则,编译器会尝试访问复制构造函数foo(const foo&amp;),因为该类型是noncopyable,所以无法访问。 boost::move 将值转换回 r 值引用(或隐藏在 BOOST_RV_REF(foo) 后面的任何东西,模拟 C++03 中的 r 值引用),正确调用 foo(BOOST_RV_REF(foo) other)

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多