2013-02-26 81 views
1

我顯然誤解有關模板特重要的東西,這是因爲:模板專業化與常量

template<typename type> const type getInfo(int i) { return 0; } 
template<> const char* getInfo<char*>(int i) { return nullptr; } 

失敗,編譯:

src/main.cpp:19:24: error: no function template matches function 
     template specialization 'getInfo' 

template<typename type> type getInfo(int i) { return 0; } 
template<> char* getInfo<char*>(int i) { return nullptr; } 

作品精細。我如何使用const和模板專業化?我的菜鳥錯誤是什麼?

我在鏗鏘聲++上使用C++ 11。

回答

5

請注意,在第一個示例中,返回類型爲const type,因此const適用於整個類型。如果typechar*(如您的專業化),那麼返回類型是char * const。這編譯得很好:

template<typename type> const type getInfo(int i) { return 0; } 
template<> char* const getInfo<char*>(int i) { return nullptr; } 

這是有道理的 - 如果專門化類型作爲指針。爲什麼模板對指針指向的內容有任何意見?

但是,在這種情況下,我看不到有很多理由讓返回類型爲const

+0

謝謝。我必須遲早得到const規則的鞏固。 const返回類型的原因涉及到原始代碼。上面的版本是我對問題的最小再現,所以是的,在這裏並不是很有用。 – Ian 2013-02-26 19:06:41

1

如果您需要能夠返回字符串常量只是用這樣的:

template<typename type> type getInfo(int i) { return 0; } 
template<> const char* getInfo<const char*>(int i) { return nullptr; } 

你試圖做的是一樣的東西:

const int getInfo(int i) { return 0; } 

它並沒有多大意義。

+0

sftrabbit的回答讓我明白了我的錯誤,但你的回答更多的是我真正需要的,對不起,我不能同時接受! – Ian 2013-02-26 18:57:23