2014-05-09 77 views
5

我想寫一個模板特用於返回數值數組(普通版)或c-字符串數組中最長的C-串的最大值函數(專業化)。如果我不使用常量,我的函數原型看起來像這樣使用爲const char **與模板專門

template <typename T> 
T maxn(T* my_Tptr, unsigned int n); 

template <> 
char* maxn <char*> (char** my_cstrings, unsigned int n); 

和我的代碼編譯。

但是,如果我嘗試使用常量性,我的函數原型看起來像這樣,

template <typename T> 
T maxn(const T* my_Tptr, unsigned int n); 

template <> 
char* maxn <char*> (const char** my_cstrings, unsigned int n); 

我的代碼不能編譯,編譯器(GCC)打印此錯誤:

錯誤:'char * maxn(const char **,unsigned int)'的template-id'maxn'不匹配任何模板聲明。

我哪裏錯了?

+0

不是我介意,但我真的想知道爲什麼你需要在源代碼中構建? – evilruff

+0

'模板<> 字符常量* MAXN (字符常量* const的*,無符號整型);'或'模板<> 字符* MAXN (char * const的*,無符號整型);' – dyp

回答

2

問題出在const。如果仔細觀察const T* my_Tptr意味着my_Tptr是指向常量T的指針。但const char** my_Tptr意味着Tptr是指向const char指針的指針。因此,類型從指針移動到常量T指向指向常量T的指針。如果你使它成爲char* const* my_Tptr*那麼它將起作用,因爲那時類型將是指向常量字符指針的指針。專業化是指針爲const T * - >指針爲const char *

1

不知道什麼是它背後的整個邏輯,但如果你改變你的模板定義說,你期待的指針,這將有助於:

template <typename T> 
T* maxn(const T** my_Tptr, unsigned int n); 

template <> 
char* maxn(const char** my_cstrings, unsigned int n); 
0

這種精細編譯:

template <> 
char* maxn(char* const* my_cstrings, unsigned int n); 

它接受一個指向常量字符指針的指針,就像在基本模板中指定的一樣。

0

您可能提供該炭情況下幾個重載來解決問題:

#include <iostream> 
#include <stdexcept> 

template <typename T> 
T maxn(const T* const data, unsigned int n) { 
    throw std::logic_error("Failure"); 
} 

const char* maxn(const char * const * data, unsigned int n) { 
    return "Success"; 
} 

inline const char* maxn(const char** data, unsigned int n) { 
    return maxn(static_cast<const char * const *>(data), n); 
} 

inline const char* maxn(char* const * data, unsigned int n) { 
    return maxn(static_cast<const char * const *>(data), n); 
} 

inline const char* maxn(char** data, unsigned int n) { 
    return maxn(static_cast<const char * const *>(data), n); 
} 

int main() { 
    const char* a[] = { "A", "B", "C" }; 
    std::cout << maxn((const char * const *)a, 3) << '\n'; 
    std::cout << maxn((const char **)a, 3) << '\n'; 
    std::cout << maxn((char * const *)a, 3) << '\n'; 
    std::cout << maxn((char**)a, 3) << '\n'; 
}