2012-03-04 48 views
2

我有一個類的模板成員函數,用於向列表中添加各種不同類型,並進行特殊處理和包裝(所有內容都結束了包裹在一個VAR對象)爲特定類型:專門處理std :: string和char []參數的模板成員函數

template<typename V> const var& addvar(const V& v); 

template<> const var& addvar<std::string>(const std::string& v) {/*stuff*/} 

不過,我身邊掠過的字符串(當然,爲const char陣列)這樣吧:

object.addvar("lol"); 

雖然我管所有東西都是std :: strings,這會以某種常量字符數組引用的形式出現在模板參數類型中扣除。所以我得到一個關於沒有函數的錯誤,即使使用上面的std :: string專門化。我熟悉模板數組大小演繹,所以我嘗試使用格式創建,可以處理這樣的事情的addvar,是這樣的:

template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/} 

但事情與非法編譯器錯誤去可怕參考數組。這是在VC++ 2010中,如果有任何具體的古怪,但我覺得我搞砸了一些基本的東西。

回答

4

不能部分專門模板的功能,所以它必須是一個過載(=不與初始addvar模板函數共享任何模板):

template<size_t N> const var& addvar(const char (&v)[N]) {/*stuff*/} 
+0

啊哈,我試着用addvar ,它沒有工作,但這樣做你的方式沒有工作正常。謝謝! – user173342 2012-03-04 21:54:08

1
template<size_t N> const var& addvar<char>(const char& (&v)[N]) {/*stuff*/} 
                ^

const char後刪除&,您要專門爲引用的陣列方式,這是不是你想要的(並且是非法的任何一種方式)。

+0

這給了我錯誤「非法使用顯式模板參數」 – user173342 2012-03-04 21:53:06

1

功能會是什麼樣子這樣的:

template <std::size_t N> 
void foo(const char (&a)[N]) 

但你的問題是,你不能部分專門的功能。無論你做什麼,都是定義一個簡單的重載,這將是首選,並從編譯器調用。