C++ MSVC+中可能存在的编译器错误+;
我相信我在MSVC++中发现了一个编译器错误(截止到2013年)。在我报告它之前,我想检查它是否确实是一个bug 以下代码: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()
#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上编译的,那就更奇怪了——我一直在努力寻找一个最小的例子,显然没有足够的支持。如果有一个“正确的”主模板主体,它仍然会失败(正如您所期望的那样,模板没有实例化,因此不应该编译)。我将编辑该问题。似乎我注释了错误的错误行。同样是固定的。如果你只显示你改变的部分,你的答案会更容易阅读。