Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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++ char*和char[N]的不明确错误_C++_Templates - Fatal编程技术网

C++ char*和char[N]的不明确错误

C++ char*和char[N]的不明确错误,c++,templates,C++,Templates,有人能帮我理解这种行为是否正确吗 考虑这个例子: #include <iostream> using namespace std; template <typename T> struct test { }; template <typename T> bool operator==(const test<T>& obj, const T* arr) { return true; } template <typename

有人能帮我理解这种行为是否正确吗

考虑这个例子:

#include <iostream>
using namespace std;

template <typename T>
struct test {
};

template <typename T>
bool operator==(const test<T>& obj, const T* arr) {
    return true;
}

template <typename T, size_t TN>
bool operator==(const test<T>& obj, const T (&arr)[TN]) {
    return false;
}

int main() {
    cout << ( test<char>() == "string" ) <<endl;
    return 0;
}
#包括
使用名称空间std;
模板
结构测试{
};
模板
布尔运算符==(常数测试和对象,常数T*arr){
返回true;
}
模板
布尔运算符==(常数测试和对象、常数T和arr)[TN]){
返回false;
}
int main(){

cout使用相当新的版本(即开发部门的最新负责人)当然,也有歧义。我本以为采用数组的重载更好,但代码似乎不明确。然而,我还没有在标准中找到相关条款。

据我所知,简单重载在新版本的gcc中不起作用,在VC10中已经不起作用

因此,如果有人想知道如何解决这个问题,这里有一个解决方案:

template <typename T>
struct test {
};

template <typename T>
struct parse {
};

template <typename T>
struct parse<T*> {
    static bool run() {
        return true;
    }
};

template <typename T, size_t TN>
struct parse<T[TN]> {
    static bool run() {
        return false;
    }
};

template <typename T, typename T2> 
bool operator==(const test<T>& obj, const T2& obj2) {
    return parse<T2>::run();
}

int main() {
    cout << ( test<char>() == "string" ) <<endl;
    cout << ( test<char>() == (char*)"string" ) <<endl;
    return 0;
}
模板
结构测试{
};
模板
结构解析{
};
模板
结构解析{
静态布尔运行(){
返回true;
}
};
模板
结构解析{
静态布尔运行(){
返回false;
}
};
模板
布尔运算符==(常数测试和obj、常数T2和obj2){
返回parse::run();
}
int main(){

我想这是不明确的。+1我相当肯定它是由14.8.2.4
[temp.decrete.partial]
和14.5.6.2
[temp.func.order]
驱动的。如果说标准的那些部分是“丰满的”,那就太轻描淡写了。尽管如此,我还是通过实际的跑腿工作回答了一个类似的问题(现在想不起来了)并且相信你是正确的,所以+1。关键是标识和数组到指针转换的秩是相同的:完全匹配,所以没有一个转换序列(无转换/数组到指针)比另一个更差。