2016-08-03 60 views
0

模板函數我有一個模板函數:傳遞按引用`爲const char *`專業化

template<typename T> 
void foo(T const & t); 

而且該函數的一些特例:

template<> void foo<int>(int const & t) { 
    cout << t << endl; 
} 

template<> void foo<const char *>(const char * const & t) { 
    cout << t << endl; 
} 

而且某些方面,我想調用該功能:

foo(3); 
foo("Hello, world."); 

但我無法弄清楚如何制定模板,以便模板類型de管道獲得文字intconst char *正確。如果我這樣做,那麼我得到undefined reference to void foo<char [14]>(char const [14] &)。我試圖重鑄模板是這樣的:

template<typename T> 
void foo(T t); 

template<> void foo<int>(int t) { ... } 
template<> void foo<const char *>(const char * t) { ... } 

它的工作原理,但當然,現在我得到呼叫值語義,要求我用的模板參數有一個拷貝構造函數的任何類類型。

有沒有辦法編寫通過引用模板功能與const char *專業化的作品?

+2

[FYI]字符串文字的類型爲「const char [n]'而不是'const char *'。 – NathanOliver

+0

任何理由更喜歡'template <> void foo (int const&t)'over'template <> void foo (int t)'?我寧願通過值原始類型傳遞 – Danh

回答

4

此:

foo("Hello, world."); 

不調用foo<const char*>。它叫foo<char[14]>,因爲foo需要T const&。您的專業化不會被調用,因爲它與模板的類型不同。

這就是說,只是不專門。過載:

template<typename T> 
void foo(T const&); 

void foo(int const&); 

void foo(char const*); 

它更容易推理,更有可能做你真正想要的東西。

+0

當然。在混合中加入超載是我錯過的。謝謝。 – Tom

+0

我明白了第一點 - 只是沒有如何獲得我所期待的效果。 – Tom