Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
程序无法调用专用模板实现 我正在学习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 - Fatal编程技术网

程序无法调用专用模板实现 我正在学习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++模板。当我运行下面的示例时,程序无法调用专门的模板实现。因此,我得到了错误的输出。谁能告诉我为什么 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

参数作为常量字符传递。因此,请尝试以下代码。请注意,我还包含了必要的头文件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::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 Try
const 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'
始终是可移植的。