boost :: shared_ptr和Return Type Resolver idiom

时间:2013-06-07 09:50:21

标签: c++ boost shared-ptr operator-keyword ambiguity

我目前正在研究Java或C#C ++中的Object概念。它类似于boost :: any这样的变体类型,但具有更广泛的功能。为此,我使用boost::shared_ptr来实际存储实际数据,并且我想提供返回类型解析器习惯用法,以便轻松获取此数据,因为它存储在实际实现中。我知道我可以在分配运算符或构造函数中使用boost::shared_ptr自动转换,但正如我所说shared_ptr在此阶段不可用。

实现RtR我遇到了linux平台的问题。为了简化代码,我只提供了一个简单的代码,它反映了我基本上想要做什么,以及在VS2010下工作的是什么,而不是在GCC下。任何评论或解决方案都应该是适当的。

struct RtR
{
    template<typename Ptr>
    operator Ptr()
    {
        return Ptr();
    }

    template<typename Ptr>
    operator Ptr() const
    {
        return Ptr();
    }
};

class TestRtR
{
    void test()
    {
        boost::shared_ptr<int> intPtr(new int);
        intPtr = get();
    }

    void test() const
    {
        boost::shared_ptr<const int> intPtr(new int);
        intPtr = get();
    }

    RtR get()
    {
        RtR ret;
        return ret;
    }

    const RtR get() const
    {
        const RtR ret;
        return ret;
    }
};

正如我所说 - 如果你在VS2010下编译它一切顺利,但在linux下我得到:

In member function ‘void TestRtR::test()':
error: ambiguous overload for ‘operator=’ in ‘intPtr = TestRtR::get()’
note: candidates are:
note: boost::shared_ptr<T>& boost::shared_ptr<T>::operator=(const boost::shared_ptr<T>&) [with T = int, boost::shared_ptr<T> = boost::shared_ptr<int>]
note: boost::shared_ptr<T>& boost::shared_ptr<T>::operator=(boost::shared_ptr<T>&&) [with T = int, boost::shared_ptr<T> = boost::shared_ptr<int>]
note: boost::shared_ptr<T>& boost::shared_ptr<T>::operator=(boost::detail::sp_nullptr_t) [with T = int, boost::shared_ptr<T> = boost::shared_ptr<int>, boost::detail::sp_nullptr_t = std::nullptr_t]
In member function ‘void TestRtR::test() const’:
error: ambiguous overload for ‘operator=’ in ‘intPtr = TestRtR::get()’
note: candidates are:
note: boost::shared_ptr<T>& boost::shared_ptr<T>::operator=(const boost::shared_ptr<T>&) [with T = const int, boost::shared_ptr<T> = boost::shared_ptr<const int>]
note: boost::shared_ptr<T>& boost::shared_ptr<T>::operator=(boost::shared_ptr<T>&&) [with T = const int, boost::shared_ptr<T> = boost::shared_ptr<const int>]
note: boost::shared_ptr<T>& boost::shared_ptr<T>::operator=(boost::detail::sp_nullptr_t) [with T = const int, boost::shared_ptr<T> = boost::shared_ptr<const int>, boost::detail::sp_nullptr_t = std::nullptr_t]

GCC和VS2010的boost::shared_ptr定义是否有所不同?这种模棱两可的基础是什么以及如何解决它?

0 个答案:

没有答案