在我的代碼中,我使用模板圖像類Image<T>
與std::shared_ptr
的組合。這些圖像指針應該被傳遞給各種圖像處理功能,其中一些獨立於圖像類型。考慮Image<T>
的以下定義,以及兩個處理函數function1()
和function2()
。相關類型:模板參數扣除失敗
#include <memory>
template <typename T>
struct Image
{
typedef std::shared_ptr<Image<T>> Ptr;
};
template <typename T>
void function1 (typename Image<T>::Ptr image) {}
template <typename T>
void function2 (std::shared_ptr<Image<T>> image) {}
雖然function1()
和function2()
有效地具有相同的簽名,function1()
更容易閱讀和隱藏的指針是如何實現的細節。但是,我無法在不明確指定模板類型的情況下調用function1()
。請看下面的代碼:
int main (void)
{
Image<int>::Ptr image = std::make_shared<Image<int>>();
function1(image); // Does NOT compile
function1<int>(image); // Does compile
function2(image); // Does compile
return 0;
}
當第一次調用導致編譯錯誤:
example.cc: In function 'int main()':
example.cc:18:19: error: no matching function for call to 'function1(MyClass<int>::Ptr&)'
example.cc:18:19: note: candidate is:
example.cc:10:6: note: template<class T> void function1(typename MyClass<T>::Ptr)
example.cc:10:6: note: template argument deduction/substitution failed:
example.cc:18:19: note: couldn't deduce template parameter 'T'
我的問題是:是否有可能使用的function1()
簽名,而無需手動指定模板參數?什麼導致編譯器錯誤?
我懷疑問題是由於Image<T>::Ptr
是一個依賴類型。因此編譯器在編譯時無法知道該字段的確切定義。是否有可能告訴編譯器這個字段沒有專門化,typename
關鍵字的精神告訴編譯器一個字段是一個類型?
通過「不是真的」,你意思是「不」對吧? – Barry
@Barry那麼,我還沒有檢查過,如果VC++中的瘋狂錯誤使它在那裏工作,但是 - 沒有。 – Columbo