[英]Possible compiler bug in MSVC++
我相信我在MSVC ++中找到了編譯器錯誤(目前直到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上編譯得很好。 這是一個錯誤嗎? 它應該干凈地編譯嗎?
有趣的是,類專業化中的相同內容可以正常工作:
#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;
}
如果在模板中定義了地圖,那么它似乎也很好:
#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;
}
所以關於這個bug的假設似乎是可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.