Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++ 为什么这段代码在GCC中调用通用模板函数?_C++ - Fatal编程技术网

C++ 为什么这段代码在GCC中调用通用模板函数?

C++ 为什么这段代码在GCC中调用通用模板函数?,c++,C++,我的问题是:为什么不直观地输出“特殊字符”?,因为数组的维度不是其类型的一部分。这个维度只对变量和字段重要。所以两者都是 Common_T 及 具有相同的类型char[] 及 及 是“相同”类型的别名 (您可以查看以获得线索)直观地看,因为数组的维度不是其类型的一部分。这个维度只对变量和字段重要。所以两者都是 Common_T 及 具有相同的类型char[] 及 及 是“相同”类型的别名 (您可以查看以获得线索)这是与您的c字符串匹配的正确模板专用化 typedef char t2[];

我的问题是:为什么不直观地输出“特殊字符”?

,因为数组的维度不是其类型的一部分。这个维度只对变量和字段重要。所以两者都是

Common_T

具有相同的类型
char[]

是“相同”类型的别名


(您可以查看以获得线索)

直观地看,因为数组的维度不是其类型的一部分。这个维度只对变量和字段重要。所以两者都是

Common_T

具有相同的类型
char[]

是“相同”类型的别名


(您可以查看以获得线索)

这是与您的c字符串匹配的正确模板专用化

 typedef char t2[];
typedef char6[6];
模板整数比较(char6常量和s1,char6常量和s2)
{

cout这是与c字符串匹配的正确模板专门化

 typedef char t2[];
typedef char6[6];
模板整数比较(char6常量和s1,char6常量和s2)
{


当您将代码更改为
inti=compare(“hello”,5)时,您会得到什么
?编译错误是肯定的。但我认为参数类型将包含在诊断消息中,因此这可能会回答您的问题。VC2010输出特殊字符6但为什么VC2010输出特殊字符6 T?@hu wang:或者为什么gcc不输出?我还不知道。有趣的是,如果从typedef中删除const(typedef Char6[6];)然后GCC也会输出特殊的字符6。似乎这是与(可能的)“双常量”与typedef一起崩溃有关的一些微妙的事情。在C++2011中,它是
typedef std::array Char6
的一个很好的用例,当您将代码更改为
int i=compare(“hello”,5)时,您会得到什么
?编译错误是肯定的。但我认为参数类型将包含在诊断消息中,因此这可能会回答您的问题。VC2010输出特殊字符6但为什么VC2010输出特殊字符6 T?@hu wang:或者为什么gcc不输出?我还不知道。有趣的是,如果从typedef中删除const(typedef Char6[6];)然后GCC也会输出特殊的字符6。似乎这是与(可能的)“双常量”用typedef崩溃有关的一些微妙的事情。在C++2011中,这是
typedef std::array Char6
@Mehrdad read from right to left“s1是对常量“Char6 type”的引用,它扩展为“s1是对大小为6的常量字符数组的引用”的一个很好的用例哦……我以为这是一个变量声明;我没有看到
typedef
!!对此非常抱歉。@huwang无法将赋值中的'const char[6]'转换为'main()::wtf'是我执行enum wtf{};wtf lol;lol=“hello”时得到的结果;是的,根据gcc,它是一个常量字符数组,符合标准。@Mehrdad read from right to left“s1是对常量“char6 type”的引用,它扩展为“s1是对大小为6的常量字符数组的引用”哦……我以为这是一个变量声明;我没有看到
typedef
!!对此非常抱歉。@huwang无法将赋值中的'const char[6]'转换为'main()::wtf'是我执行enum wtf{};wtf lol;lol=“hello”时得到的结果是的,根据gcc,它是一个常量字符数组,符合标准。你的直觉是错误的。数组绑定肯定是它类型的一部分。这就是为什么
sizeof(t1)
是6。如果数组绑定不是类型的一部分,
sizeof
无法推断出它。@MSalters:我同意你的观点
sizeof
不是类型的一部分;否则是
char*
参数和
char[]
formal不适合。它们肯定有不同的
sizeof
@basiletarynkevitch:What’t NOT fit?(不适合)是什么意思?另外,请注意,示例中的
longstring
的类型不是
char[]
。这只是一个简写声明。编译器会将类型推断为
char[39]
从其初始值的长度。以
put
为例:您可以使用参数
const char hello[]=“hello”
调用它,其
sizeof
为6或
const char*p=strdup(“foobarbarbar”);
sizeof
sizeof(void*)
ie 8在64位机器上。因此
sizeof
不是参数类型的一部分。你的直觉是错误的。数组绑定肯定是其类型的一部分。这就是为什么
sizeof(t1)
是6。如果数组绑定不是类型的一部分,
sizeof
无法推断出它。@MSalters:我同意你的观点
sizeof
不是类型的一部分;否则是
char*
参数和
char[]
formal不适合。它们肯定有不同的
sizeof
@basiletarynkevitch:What’t NOT fit?(不适合)是什么意思?另外,请注意,示例中的
longstring
的类型不是
char[]
。这只是一个简写声明。编译器会将类型推断为
char[39]
从其初始值的长度。以
put
为例:您可以使用参数
const char hello[]=“hello”
调用它,其
sizeof
为6或
const char*p=strdup(“foobarbarbar”);
sizeof
sizeof(void*)
ie 8在64位机器上。因此
sizeof
不是参数类型的一部分。
 typedef char t1[6];
 typedef char t2[];
typedef char char6[6];
template<> int compare<char6>(char6 const &s1,char6 const &s2)
{
    cout << "Special_Char6_T" << endl;
    return 0;
}