В настоящее время я работаю над концепцией Object, известной в Java или C # для C ++. Это было бы похоже на вариантный тип, такой как boost :: any, но с более широкой функциональностью. Для этого я использую boost::shared_ptr
для внутреннего хранения фактических данных, и я хотел предоставить идиому Return Type Resolver для легкого получения этих данных, так как они хранятся в реальной реализации. Я знаю, что мог бы использовать 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_ptr
отличается под GCC и VS2010? В чем причина этой двусмысленности и как ее решить?
Задача ещё не решена.
Других решений пока нет …