2014-05-09 17 views
5

Tôi đang cố gắng viết chuyên môn mẫu cho hàm trả về giá trị lớn nhất của một mảng giá trị số (phiên bản chung) hoặc chuỗi c dài nhất của một chuỗi các chuỗi c (chuyên môn). Nếu tôi không sử dụng const-ness, các prototype nguyên mẫu của tôi trông giống như hình minh họaSử dụng const char ** với Chuyên môn mẫu

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

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

và mã của tôi biên dịch.

Tuy nhiên, nếu tôi cố gắng sử dụng const-Ness, nguyên mẫu chức năng của tôi trông như thế này,

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

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

mã của tôi không biên dịch, và trình biên dịch (gcc) in lỗi này:

lỗi : template-id 'maxn' cho 'char * maxn (const char **, unsigned int)' không khớp với bất kỳ khai báo mẫu nào.

Tôi sẽ làm gì sai?

+0

Không phải là tôi quan tâm, nhưng tôi thực sự tự hỏi tại sao bạn cần xây dựng trong mã nguồn của bạn? – evilruff

+0

'mẫu <> char const * maxn (char const * const *, unsigned int);' hoặc 'mẫu <> char * maxn (char * const *, unsigned int);' – dyp

Trả lời

2

Sự cố xảy ra ở số const. Nếu bạn quan sát chặt chẽ const T* my_Tptr có nghĩa là my_Tptr là một con trỏ tới const T. Nhưng const char** my_Tptr có nghĩa là Tptr là một con trỏ trỏ đến const char. Vì vậy, loại di chuyển từ con trỏ đến const T đến con trỏ tới con trỏ tới const T. Nếu bạn làm cho nó char* const* my_Tptr* sau đó nó sẽ làm việc, kể từ đó loại sẽ là con trỏ đến con trỏ const char. Sự chuyên môn hoá là con trỏ đến const T * -> con trỏ đến const char *

1

Không chắc toàn bộ logic đằng sau nó là gì nhưng nếu bạn thay đổi định nghĩa mẫu của bạn để nói rằng bạn đang mong đợi con trỏ sẽ giúp:

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

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

này biên dịch tốt:

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

Nó chấp nhận một con trỏ tới một con trỏ const char như được chỉ định trong mẫu cơ sở.

0

Bạn có thể cung cấp một số quá tải cho các char hợp cụ thể để giải quyết vấn đề:

#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'; 
} 
Các vấn đề liên quan