我試圖製作一些可以讀取或寫入不同類型的文件流。除了具體方法的閱讀部分之外,一切都有效。該方法在調用時返回std::unique_ptr<T>
,並且是另一種返回T
的方法的「包裝器」。出於某種原因,編譯器不使用此方法,而是嘗試使用另一種方法(返回T
)編譯它。因爲這個編譯失敗。我已經嘗試過在互聯網上搜索,但我找不到任何準確的答案。你能幫我解決這個問題嗎?具有相同名稱但返回類型不同的C++模板函數
兩種方法我已經定義:
template <typename T>
T read()
{
T obj;
obj.readFromFile<T>();
return std::move(obj);
}
和
template <
typename T,
template<typename> class D,
template<typename, typename> class Container
>
typename std::enable_if_t<
std::is_same<Container<T, D<T>>, std::unique_ptr<T, D<T>>>::value,
Container<T, D<T>>
>
read()
{
return std::move(std::make_unique<T, D<T>>(readFromFile<T>()));
}
後一種方法是,我試圖調用一個。
當我寫的東西是這樣的:
std::unique_ptr<A> AfromFile = fileStreamer.read<std::unique_ptr<A>>()
編譯器試圖與第一種方法(template <typename T> T read() {...}
)和編譯失敗編譯它。如果我首先製作了unique_ptr object
,並且將它複製到*unique_ptr<A> object
,但是這對我來說並不合適,因爲我在這兩個函數上使用了一些宏,並且我無法在調用宏之前使對象A自己成爲unique_ptr<A> object
。僅供參考,我正在使用Visual Studio 2015.
有什麼方法可以使這項工作沒有任何重大修改?我還發現一個建議,基本上說你必須給一個函數添加一個指針參數,然後用static_cast<Obj>(nullptr)
作爲參數來調用它,但這不算在我的例子中。
感謝您的幫助。
更新: 我只想作出發言,下面所有的解決方案所做的工作對我來說不過來解決我的問題的解決方案通過提供巴里最簡單的方法。 Thx再次幫助我!
你將不得不調用'fileStreamer.read ,性病::的unique_ptr>()'... – Jarod42
你說得對,確實是我調用這個方法用錯了號碼的參數。在我提出正確的參數數量後,代碼編譯 – Bected