C++ 在模板专业化中的 strcmp() 中从 'char' 到 'const char*' 的无效转换
C++ invalid conversion from 'char' to 'const char*' in strcmp() within a template specialization
我在将 strcmp() 用于模板专业化内的 const char* 数组时遇到问题。
在我的脚本中,我想对几个数组进行排序,从大 values/length 到小数组。它适用于整数和浮点数组,但不适用于 const char* 数组。我用它们的定义声明了 3 个模板函数。对于 const char* 数组,我使用了一个专门的模板函数,该函数使用 strcmp(const char*, const char*) 函数对数组进行排序。
我的脚本如下(第一个是模板声明,第二个是主脚本,第三个是模板函数定义):
#include <iostream>
#include <string.h>
using namespace std ;
// Template function declarations
template <class T>
void order(T& a, T& b) ;
template <class T>
void sort(T* c, int d) ;
template <class T>
void display(T* e, int f) ;
// Main
int main() {
int random[10] = {10,23,5,37,56,0,20,88,95,32} ; // Random Array of integers
float random_fl[10] = {9.5,66.2,5.8,41.1,89.4,0.6,23.4,66.5,90.9,57.7} ; // Random Array of floats
const char* random_char[] = {"blah", "blahblah", "string", "character", "literal", "one", "randomize", "unsigned", "red", "wolf"} ;
int length = sizeof(random)/sizeof(int) ; // Calculating the lenght of the array
int length_fl = sizeof(random_fl)/sizeof(float) ;
int length_char = sizeof(random_char)/sizeof(const char*) ;
cout << "Initial integer Array: "; // Terminal message giving the initial array
for (int i = 0; i < length; ++i) {
cout << random[i] << " ";
}
cout << endl;
cout << "Initial float Array: ";
for (int i = 0; i < length_fl; ++i) {
cout << random_fl[i] << " ";
}
cout << endl;
cout << "Initial character Array: ";
for (int i = 0; i < length_char; ++i) {
cout << random_char[i] << " ";
}
cout << endl;
sort(random, length) ; // Call sort() function to sort array
sort(random_fl, length_fl) ;
sort(random_char, length_char) ;
display(random, length) ; // Call display() function to print sorted array in terminal
display(random_fl, length_fl) ;
//display(random_char, length_char) ;
return 0 ;
}
// Template function definitions
template <class T>
void order(T& a, T& b) { // order function using references
T Temp = a ;
a = b ;
b = Temp ;
}
template <class T>
void sort(T* c, int d) { // Sorting function
for (int i=0; i<d-1; i++) {
for (int j=0; j<d-1-i; j++) {
if(c[j+1] > c[j]) {
order(c[j] , c[j+1]) ;
}
}
}
}
template<>
void sort(const char* a, int b) { // Template specialization sort function for character string
for (int i=0; i<b-1; i++) {
for (int j=0; j<b-1-i; j++) {
if(strcmp(a[j+1], a[j])>0) {
order(a[j], a[j+1]) ;
}
}
}
}
template <class T>
void display(T* e, int f) { // Display function
cout << "Sorted Array: ";
for (int i=0; i<f; i++) {
cout << e[i] << " ";
}
cout << endl ;
}
编译脚本时,我收到错误消息,指出在我的专用模板内的 strcmp(const char*, const char*) 函数中发生了从 'char' 到 'const char*' 的无效转换功能。我想知道为什么,因为我定义了一个包含 10 个字符串文字的 const char* 数组。因此数组元素 a[j+1] 和 a[j] 也应该是 const char* 元素,因为这是它们在具有 const char* a.[ 定义的专门排序函数的开头所期望的。 =13=]
我是 c++ 的新手,尤其难以理解指针以及如何使用 pointers/references 引用数组元素,我认为这是问题的根源。
请不要介意我的英语,提前谢谢你。
编辑:
尽管我的用于获取排序字符串的 if() 语句还不正确,正如 Steiner 所指出的,strcmp() 现在正在按预期工作。
非常感谢大家的帮助。
如果您将 const
变量传递给采用非常量参数的函数,编译器会报错。 const char*
的一个元素是 const char
,它与您的函数 order(T&, T&)
.
不兼容
除此之外,您的程序还有一些其他问题,例如 strcmp()
的括号,以及 strcmp()
与单个字符的用法。
正如@Arkadiy 部分提到的,您在 const char* 的 sort 专业化中缺少一颗星,并且 if 条件不正确:
template<>
void sort(const char** a, int b) {
for (int i=0; i<b-1; i++) {
for (int j=0; j<b-1-i; j++) {
if( strcmp(a[j+1], a[j]) > 0 ) {
order(a[j], a[j+1]) ;
}
}
}
并且此特化必须出现在 main 之前,否则会出现以下类型的编译器错误:实例化后的特化(请参阅 this question)。
如果你改变这个你会得到正确的输出:
Initial chararacter Array: blah blahblah string character literal one randomize unsigned red wolf
Sorted Array: wolf unsigned string red randomize one literal character blahblah blah
我之前的回答是废话,steiner回答是正确的,你的排序模板应该是:
template<>
void sort(const char** a, int b) {
并位于其实例化点之上(即在 main() 之上)
我在将 strcmp() 用于模板专业化内的 const char* 数组时遇到问题。
在我的脚本中,我想对几个数组进行排序,从大 values/length 到小数组。它适用于整数和浮点数组,但不适用于 const char* 数组。我用它们的定义声明了 3 个模板函数。对于 const char* 数组,我使用了一个专门的模板函数,该函数使用 strcmp(const char*, const char*) 函数对数组进行排序。
我的脚本如下(第一个是模板声明,第二个是主脚本,第三个是模板函数定义):
#include <iostream>
#include <string.h>
using namespace std ;
// Template function declarations
template <class T>
void order(T& a, T& b) ;
template <class T>
void sort(T* c, int d) ;
template <class T>
void display(T* e, int f) ;
// Main
int main() {
int random[10] = {10,23,5,37,56,0,20,88,95,32} ; // Random Array of integers
float random_fl[10] = {9.5,66.2,5.8,41.1,89.4,0.6,23.4,66.5,90.9,57.7} ; // Random Array of floats
const char* random_char[] = {"blah", "blahblah", "string", "character", "literal", "one", "randomize", "unsigned", "red", "wolf"} ;
int length = sizeof(random)/sizeof(int) ; // Calculating the lenght of the array
int length_fl = sizeof(random_fl)/sizeof(float) ;
int length_char = sizeof(random_char)/sizeof(const char*) ;
cout << "Initial integer Array: "; // Terminal message giving the initial array
for (int i = 0; i < length; ++i) {
cout << random[i] << " ";
}
cout << endl;
cout << "Initial float Array: ";
for (int i = 0; i < length_fl; ++i) {
cout << random_fl[i] << " ";
}
cout << endl;
cout << "Initial character Array: ";
for (int i = 0; i < length_char; ++i) {
cout << random_char[i] << " ";
}
cout << endl;
sort(random, length) ; // Call sort() function to sort array
sort(random_fl, length_fl) ;
sort(random_char, length_char) ;
display(random, length) ; // Call display() function to print sorted array in terminal
display(random_fl, length_fl) ;
//display(random_char, length_char) ;
return 0 ;
}
// Template function definitions
template <class T>
void order(T& a, T& b) { // order function using references
T Temp = a ;
a = b ;
b = Temp ;
}
template <class T>
void sort(T* c, int d) { // Sorting function
for (int i=0; i<d-1; i++) {
for (int j=0; j<d-1-i; j++) {
if(c[j+1] > c[j]) {
order(c[j] , c[j+1]) ;
}
}
}
}
template<>
void sort(const char* a, int b) { // Template specialization sort function for character string
for (int i=0; i<b-1; i++) {
for (int j=0; j<b-1-i; j++) {
if(strcmp(a[j+1], a[j])>0) {
order(a[j], a[j+1]) ;
}
}
}
}
template <class T>
void display(T* e, int f) { // Display function
cout << "Sorted Array: ";
for (int i=0; i<f; i++) {
cout << e[i] << " ";
}
cout << endl ;
}
编译脚本时,我收到错误消息,指出在我的专用模板内的 strcmp(const char*, const char*) 函数中发生了从 'char' 到 'const char*' 的无效转换功能。我想知道为什么,因为我定义了一个包含 10 个字符串文字的 const char* 数组。因此数组元素 a[j+1] 和 a[j] 也应该是 const char* 元素,因为这是它们在具有 const char* a.[ 定义的专门排序函数的开头所期望的。 =13=]
我是 c++ 的新手,尤其难以理解指针以及如何使用 pointers/references 引用数组元素,我认为这是问题的根源。
请不要介意我的英语,提前谢谢你。
编辑:
尽管我的用于获取排序字符串的 if() 语句还不正确,正如 Steiner 所指出的,strcmp() 现在正在按预期工作。
非常感谢大家的帮助。
如果您将 const
变量传递给采用非常量参数的函数,编译器会报错。 const char*
的一个元素是 const char
,它与您的函数 order(T&, T&)
.
除此之外,您的程序还有一些其他问题,例如 strcmp()
的括号,以及 strcmp()
与单个字符的用法。
正如@Arkadiy 部分提到的,您在 const char* 的 sort 专业化中缺少一颗星,并且 if 条件不正确:
template<>
void sort(const char** a, int b) {
for (int i=0; i<b-1; i++) {
for (int j=0; j<b-1-i; j++) {
if( strcmp(a[j+1], a[j]) > 0 ) {
order(a[j], a[j+1]) ;
}
}
}
并且此特化必须出现在 main 之前,否则会出现以下类型的编译器错误:实例化后的特化(请参阅 this question)。
如果你改变这个你会得到正确的输出:
Initial chararacter Array: blah blahblah string character literal one randomize unsigned red wolf
Sorted Array: wolf unsigned string red randomize one literal character blahblah blah
我之前的回答是废话,steiner回答是正确的,你的排序模板应该是:
template<>
void sort(const char** a, int b) {
并位于其实例化点之上(即在 main() 之上)