Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ MSVC+中可能存在的编译器错误+;_C++_Visual C++_Compiler Bug - Fatal编程技术网

C++ MSVC+中可能存在的编译器错误+;

C++ MSVC+中可能存在的编译器错误+;,c++,visual-c++,compiler-bug,C++,Visual C++,Compiler Bug,我相信我在MSVC++中发现了一个编译器错误(截止到2013年)。在我报告它之前,我想检查它是否确实是一个bug 以下代码: #include <map> using std::map; template <typename T> class A { public: typedef T StoredType; }; template <typename T> map<typename T::StoredType, int> foo()

我相信我在MSVC++中发现了一个编译器错误(截止到2013年)。在我报告它之前,我想检查它是否确实是一个bug

以下代码:

#include <map>

using std::map;

template <typename T>
class A
{
public:
    typedef T StoredType;
};

template <typename T>
map<typename T::StoredType, int> foo()
{
    map<typename T::StoredType, int> ret;
    return ret;
}  

template<>
map<char, int> foo<A<char>>()
{
    map<char, int> ret;
    return ret;
} // Error on this line

int main(int, char**)
{
    return 0;
}
#包括
使用std::map;
模板
甲级
{
公众:
typedef T存储类型;
};
模板
mapfoo()
{
地图检索;
返回ret;
}  
模板
mapfoo()
{
地图检索;
返回ret;
}//这行有错误
int main(int,char**)
{
返回0;
}
生成编译错误:

1>d:\documents\visual studio 2010\projects\proj\proj\source1.cpp(24): error C2785: 'std::map<T::StoredType,int> foo(void)' and 'std::map<_Kty,_Ty> foo(void)' have different return types
1>          with
1>          [
1>              _Kty=char,
1>              _Ty=int
1>          ]
1>          d:\documents\visual studio 2010\projects\proj\proj\source1.cpp(13) : see declaration of 'foo'
1>          d:\documents\visual studio 2010\projects\proj\proj\source1.cpp(20) : see declaration of 'foo'
1>d:\documents\visual studio 2010\projects\proj\proj\source1.cpp(24): error C2912: explicit specialization; 'std::map<_Kty,_Ty> foo<A<T>>(void)' is not a specialization of a function template
1>          with
1>          [
1>              _Kty=char,
1>              _Ty=int,
1>              T=char
1>          ]
1>d:\documents\visualstudio 2010\projects\proj\proj\source1.cpp(24):错误C2785:“std::map foo(void)”和“std::map foo(void)”具有不同的返回类型
1> 与
1>          [
1> _Kty=char,
1> _Ty=int
1>          ]
1> d:\documents\visualstudio2010\projects\proj\proj\source1.cpp(13):参见“foo”的声明
1> d:\documents\visualstudio2010\projects\proj\proj\source1.cpp(20):参见“foo”的声明
1> d:\documents\visual studio 2010\projects\proj\proj\source1.cpp(24):错误C2912:显式专门化;'std::map foo(void)“”不是函数模板的专门化
1> 与
1>          [
1> _Kty=char,
1> _Ty=int,
1> T=char
1>          ]

然而,在我看来,它还可以,并且在ideone.com上编译得很好。是虫子吗?它应该干净地编译吗?

有趣的是,同样的东西在类专门化上运行良好:

#include <map>

using std::map;

template <typename T>
class A
{
public:
    typedef T StoredType;
};

template <typename T>
struct Z
{
    map<typename T::StoredType, int> foo()
    {
        map<T::StoredType, int> ret;
        return ret;
    }  // Error on this line
};

template<>
struct Z<A<char>>
{
    map<char, int> foo()
    {
        map<char, int> ret;
        return ret;
    }
};

int main(int, char**)
{
    return 0;
}
#包括
使用std::map;
模板
甲级
{
公众:
typedef T存储类型;
};
模板
结构Z
{
mapfoo()
{
地图检索;
返回ret;
}//这行有错误
};
模板
结构Z
{
mapfoo()
{
地图检索;
返回ret;
}
};
int main(int,char**)
{
返回0;
}
如果地图是在模板中定义的,那么它看起来也很好:

#include <map>

using std::map;

template <typename T>
class A
{
public:
    typedef map<T, int> MapType;
};

template <typename T>
typename T::MapType foo()
{
    T::MapType ret;
    return ret;
}

template<>
map<char, int> foo<A<char>>()
{
    map<char, int> ret;
    return ret;
}

int main(int, char**)
{
    return 0;
}
#包括
使用std::map;
模板
甲级
{
公众:
typedef映射类型;
};
模板
typename T::MapType foo()
{
T::MapType-ret;
返回ret;
}
模板
mapfoo()
{
地图检索;
返回ret;
}
int main(int,char**)
{
返回0;
}

因此,关于该错误的假设似乎是可能的。

在GCC 4.9.1上编译得很好出于好奇,如果您使主模板的主体合法(即将
ret
的类型更改为
map
),会有所帮助吗?@Angew同样,我错了的代码,因为
map
不是
map
,如果它是在GCC:DApologies上编译的,那就更奇怪了——我一直在努力寻找一个最小的例子,显然没有足够的支持。如果有一个“正确的”主模板主体,它仍然会失败(正如您所期望的那样,模板没有实例化,因此不应该编译)。我将编辑该问题。似乎我注释了错误的错误行。同样是固定的。如果你只显示你改变的部分,你的答案会更容易阅读。