私は現在、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_ptr
GCC と VS2010 での定義は異なりますか? このあいまいさの根拠とそれを解決する方法は何ですか?