2

私は現在、Java または C++ の C# で知られているオブジェクトの概念に取り組んでいます。これは、boost::any のようなバリアント型に似ていますが、より幅広い機能を備えています。その目的のためにboost::shared_ptr、実際のデータを内部的に保存するために使用しており、実際の実装に保存されているため、このデータを簡単に取得するための Return Type Resolver イディオムを提供したいと考えました。boost::shared_ptr代入演算子またはコンストラクター中に自動変換を使用できることはわかっていますがshared_ptr、前述のように、この段階では利用できません。

RtR の実装 Linux プラットフォームで問題が発生しました。コードを簡単にするために、基本的にやりたいことと、GCC ではなく VS2010 で機能していることを反映した単純なコードを提供します。コメントや解決策はありません。

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