В моем текущем проекте мы строим для Linux и Windows одновременно. К сожалению, поскольку некоторые платформы вызывают проблемы с MSVC, очень старый. Мы используем MSVC 2010. И gcc мы используем относительно новый и умный, который имеет версию 4.8.Кастинг std :: tr1 :: shared_ptr <T> и std :: shared_ptr <T> с такой же функцией, но с разными перегрузками
ниже код компиляции в GCC, но MSCV ворчит по этому поводу:
template<class T, class U>
std::shared_ptr<T> Cast(const std::shared_ptr<U>& spObject) // rename from CastTerrainObject
{
return std::dynamic_pointer_cast<T>(spObject);
}
template<class T, class U>
std::tr1::shared_ptr<T> Cast(const std::tr1::shared_ptr<U>& spObject) // rename from CastTerrainObject
{
return std::tr1::dynamic_pointer_cast<T>(spObject);
}
MSVC начал пилить после того, как я добавляю вторую перегрузку для станд :: tr1 :: shared_ptr. В компиляции ошибки я получаю несколько раз:
error C2995: 'std::tr1::shared_ptr<_Ty> Cast(const std::tr1::shared_ptr<_Ty2> &)' : function template has already been defined
And
error C2440: 'initializing' : cannot convert from 'std::tr1::shared_ptr<_Ty> (__cdecl *)(const std::tr1::shared_ptr<_Ty2> &)' to 'std::tr1::shared_ptr<_Ty>'
Есть ли у вас, ребята, есть решение для моего случая?
'# ifdef' это на платформах, это не работает? – Yakk
Возможно, что один из них является «использованием shared_ptr = другой». В этом случае он является одним и тем же типом и не может использоваться для перегрузки. –
@Yakk Мне жаль, что я не смог бы легко его протестировать, но как только я сделаю смену, машина автоматической сборки будет запущена, а процесс сборки займет 1-2 часа. К сожалению, я должен быть уверен, прежде чем применить. –