boost :: shared_ptr и идиома Resolver типа возврата

В настоящее время я работаю над концепцией 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? В чем причина этой двусмысленности и как ее решить?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]