char *和char [N]的模糊错误

时间:2013-12-23 16:14:50

标签: 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 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;
}

使用gcc 4.7.3,它可以很好地编译并按预期输出“0”。

但是使用Visual Studio编译器,它会报告ambiguous error (C2593)

在这种情况下谁是对的,standard对此有什么看法?

谢谢。

2 个答案:

答案 0 :(得分:4)

使用gccclang的最近版本(即最近的开发分支负责人)也显示出歧义。我本以为采用数组的重载更好但看起来代码含糊不清。但是,我没有追踪标准中的相关条款。

答案 1 :(得分:1)

据我所知,简单的重载在新版本的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;
}

用VC10,gcc-4.6.3和gcc-4.8.1编译。 似乎工作正常。