2

我目前正在研究 Java 或 C# for C++ 中已知的对象概念。它类似于 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]

boost::shared_ptrGCC和VS2010下的定义不同吗?这种模棱两可的原因是什么,如何解决?

4

0 回答 0