私の現在のプロジェクトでは、LinuxとWindows用に同時にビルドしています。 残念ながら、私たちのMSVCのプラットフォームの問題のいくつかは非常に古いためです。私たちはMSVC 2010を使用しています.gccは比較的新しいものを使用していますが、よりスマートなものにはバージョン4.8があります。標準出力:: 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は私がのstd :: tr1を:: shared_ptrのための2番目のオーバーロードを追加した後しつこい始めました。 コンパイルエラーは、私が繰り返し取得しています:
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
それらのうちの1つが「shared_ptrを使用しています=もう1つ」であるかもしれません。その場合、同じタイプであり、オーバーロードに使用することはできません。 –
@ Yakk私は簡単にテストすることができたらいいと思っていますが、一度変更を加えると自動ビルドマシンが起動され、プロセスの構築に1〜2時間かかるでしょう。残念ながら、私は最初に適用するよりも確実にする必要があります。 –