Я считаю, что обнаружил ошибку компилятора в MSVС++ (присутствует до VS 2013). Я хочу проверить, что это действительно ошибка, прежде чем сообщить об этом.
Следующий код:
#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;
}
Производит ошибку компиляции:
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> ]
Однако, это выглядит хорошо для меня, и компилируется отлично на ideone.com. Это ошибка? Должно ли оно компилироваться чисто?