Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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++ 将枚举作为模板参数传递_C++_Templates - Fatal编程技术网

C++ 将枚举作为模板参数传递

C++ 将枚举作为模板参数传递,c++,templates,C++,Templates,为什么使用下面的模板函数 template<typename T> bool isEqual(const T &v0, const T &v1) { return v0 == v1; } TestProject/main.cpp:在函数“int main()”中: TestProject/main.cpp:31:错误:调用“isEqual(main()::Enum&,main()::Enum&”)时没有匹配的函数。这可能意味着编译器已过时 在C++11之前,

为什么使用下面的模板函数

template<typename T>
bool isEqual(const T &v0, const T &v1)
{
    return v0 == v1;
}
TestProject/main.cpp:在函数“int main()”中:
TestProject/main.cpp:31:错误:调用“isEqual(main()::Enum&,main()::Enum&”)时没有匹配的函数。

这可能意味着编译器已过时

在C++11之前,没有链接的类型(例如在函数中声明的类型)不能用作模板参数。这项颇为奇怪的限制现已取消


如果您将
enum
声明移动到名称空间范围(提供外部链接),或者使用现代编译器,则应该编译您的示例:

这可能意味着您的编译器已过时

在C++11之前,没有链接的类型(例如在函数中声明的类型)不能用作模板参数。这项颇为奇怪的限制现已取消


如果您将
enum
声明移动到名称空间范围(提供外部链接),或者使用现代编译器,您的示例应该编译:

是,它确实编译。。。你能给出一个没有编译的例子吗?同样,这样一个函数的有用性是值得怀疑的。@ParkYoung Bae,在我想象的C++11之前,Clang的错误是非常明显的:错误:模板参数使用本地类型“Enum”@ParkYoung Bae,在C++11之前,MSVC支持突破这一限制,我相信其他编译器也是如此。它之所以存在,是因为
export
,而且因为没有人实现它……是的,它确实编译了。。。你能给出一个没有编译的例子吗?同样,这样一个函数的有用性是值得怀疑的。@ParkYoung Bae,在我想象的C++11之前,Clang的错误是非常明显的:错误:模板参数使用本地类型“Enum”@ParkYoung Bae,在C++11之前,MSVC支持突破这一限制,我相信其他编译器也是如此。它之所以存在,是因为
export
,而且因为没有人实现它……我使用的是gcc(gcc)4.4.7 20120313(Red Hat 4.4.7-4)。可能是“红帽”让它过时了……我在gcc(gcc)4.4.7 20120313(红帽4.4.7-4)。也许是“红色”让它过时了。。。
template<typename T>
bool isEqual(const T &v0, const T &v1)
{
    return v0 == v1;
}


int main()
{
    enum Enum
    {
        E1,
        E2,
        E3
    } v1, v2;

    v1 = E1;
    v2 = E1;

    isEqual(v1, v2);

}