程序无法调用专用模板实现 我正在学习C++模板。当我运行下面的示例时,程序无法调用专门的模板实现。因此,我得到了错误的输出。谁能告诉我为什么 template <class T> T max(T a, T b) { cout << "2 ..." <<endl; return a > b ? a : b; } template<> char* max(char* a, char* b) { cout << "1 ..." <<endl; return strcmp(a, b) > 0 ? a : b; } int main() { cout << max("Aladdin", "Jasmine") << endl; return 0; } 模板 T最大值(T a,T b) { cout
参数作为常量字符传递。因此,请尝试以下代码。请注意,我还包含了必要的头文件includes。此外,强烈建议使用程序无法调用专用模板实现 我正在学习C++模板。当我运行下面的示例时,程序无法调用专门的模板实现。因此,我得到了错误的输出。谁能告诉我为什么 template <class T> T max(T a, T b) { cout << "2 ..." <<endl; return a > b ? a : b; } template<> char* max(char* a, char* b) { cout << "1 ..." <<endl; return strcmp(a, b) > 0 ? a : b; } int main() { cout << max("Aladdin", "Jasmine") << endl; return 0; } 模板 T最大值(T a,T b) { cout,c++,templates,C++,Templates,参数作为常量字符传递。因此,请尝试以下代码。请注意,我还包含了必要的头文件includes。此外,强烈建议使用std::cout,或使用using std::cout; #include <iostream> #include <cstring> template <class T> T max(T a, T b) { std::cout << "2 ..." << std::endl; return a
std::cout
,或使用using std::cout;
#include <iostream>
#include <cstring>
template <class T>
T max(T a, T b)
{
std::cout << "2 ..." << std::endl;
return a > b ? a : b;
}
template<>
const char* max(const char* a, const char* b)
{
std::cout << "1 ..." << std::endl;
return std::strcmp(a, b) > 0 ? a : b;
}
int main()
{
std::cout << max("Aladdin", "Jasmine") << std::endl;
return 0;
}
#包括
#包括
模板
T最大值(T a,T b)
{
std::cout参数作为常量字符传递。因此,请尝试以下代码。请注意,我还包含了必要的头文件includes。此外,强烈建议使用std::cout
,或使用using std::cout;
#include <iostream>
#include <cstring>
template <class T>
T max(T a, T b)
{
std::cout << "2 ..." << std::endl;
return a > b ? a : b;
}
template<>
const char* max(const char* a, const char* b)
{
std::cout << "1 ..." << std::endl;
return std::strcmp(a, b) > 0 ? a : b;
}
int main()
{
std::cout << max("Aladdin", "Jasmine") << std::endl;
return 0;
}
#包括
#包括
模板
T最大值(T a,T b)
{
STD::CUT> P>你看到问题的原因是你所传递的参数是“代码> char const */CODE >(也可以拼写为代码> const char */COD>)。我没有任何C++中打印出一个类型的全名的标准方法。但是有一种方法来测试这种事情…
模板的一个问题是,系统将扩展它可以扩展的任何模板。因此,您的代码将以某种方式神秘地工作,并且不完全确定原因。在这种情况下,您可以让编译器告诉您确切的问题是什么,一种方法是尝试删除模板:
#include <iostream>
#include <cstring>
using ::std::cout;
using ::std::strcmp;
char* max(char* a, char* b)
{
cout << "1 ..." << '\n'; // Don't use ::std::endl Use cerr if you need flushing.
return strcmp(a, b) > 0 ? a : b;
}
int main()
{
cout << max("Aladdin", "Jasmine") << '\n';
return 0;
}
#包括
#包括
使用::std::cout;
使用::std::strcmp;
char*max(char*a,char*b)
{
CUT< P>你看到问题的原因是你所传递的参数是“代码> char const */CODE >(也可以拼写为代码> const char */COD>)。我没有任何C++中打印出一个类型的全名的标准方法。但是有一种方法来测试这种事情…
模板的一个问题是,系统将扩展它可以扩展的任何模板。因此,您的代码将以某种方式神秘地工作,并且不完全确定原因。在这种情况下,您可以让编译器告诉您确切的问题是什么,一种方法是尝试删除模板:
#include <iostream>
#include <cstring>
using ::std::cout;
using ::std::strcmp;
char* max(char* a, char* b)
{
cout << "1 ..." << '\n'; // Don't use ::std::endl Use cerr if you need flushing.
return strcmp(a, b) > 0 ? a : b;
}
int main()
{
cout << max("Aladdin", "Jasmine") << '\n';
return 0;
}
#包括
#包括
使用::std::cout;
使用::std::strcmp;
char*max(char*a,char*b)
{
cout Tryconst char*max(const char*a,const char*b)
用于专门化。是的,这解决了问题。但是为什么?我还需要为模板专门化添加const关键字吗?如果您不打算对参数应用更改,通常应该使用const
。因为字符串文字是const char
的数组,并将其作为非字符传递e> const
指针将(转换后)视为非const
指针。因此,模板函数更匹配。请尝试const char*max(const char*a,const char*b)
用于专门化。是的,这解决了问题。但是为什么?我还需要为模板专门化添加const关键字吗?如果您不打算对参数应用更改,通常应该使用const
。因为字符串文字是const char
的数组,并将其作为非字符传递e> const
指针(转换后)将其视为非const
。因此,模板函数是一个更好的匹配。对的回答似乎表明这种专门化无法完成。基本上,该声明是字符串文字的类型实际上是const char[N]
,因此如果不将特定值N
硬编码到模板中,您就无法进行专门化。该线程是从2011年开始的,因此在较新的cpp标准中做了一些更改,使其“正常工作”?您知道吗?另外,std::endl
有什么问题吗?'\n'
现在被认为是可移植的吗?@tel我相信您链接到的案例有很大不同,因为参数是通过引用传递的。但是在这个问题中,参数是通过值传递的,所以数组到指针的转换是作为模板的一部分应用的参数推断。@tel-'\n'
一直都是可移植的。对的回答似乎表明这种专门化无法完成。基本上,这种说法是字符串文字的类型实际上是常量字符[n]
,因此如果不将特定值N
硬编码到模板中,您就无法进行专门化。该线程是从2011年开始的,因此在较新的cpp标准中做了一些更改,使其“正常工作”?您知道吗?另外,std::endl
有什么问题吗?'\n'
现在被认为是可移植的吗?@tel我相信您链接到的案例有很大不同,因为参数是通过引用传递的。但是在这个问题中,参数是通过值传递的,所以数组到指针的转换是作为模板的一部分应用的参数推断。@tel-'\n'
始终是可移植的。