以下代码在VS2005和gcc-4.3.4上编译。
#include <algorithm>
#include <iostream>
template<class C, class T, T C::*x>
struct X { };
typedef std::pair<int,int> Pr;
X<Pr, int, &Pr::first> var;
int main()
{
std::cout << "hello\n";
}但它无法在VS2010上编译,并显示以下错误消息:
1>d:\a\testvs10\testvs10.cpp(13): error C2440: 'specialization' : cannot convert from 'int std::_Pair_base<_Ty1,_Ty2>::* ' to 'int std::pair<_Ty1,_Ty2>::* '
1> with
1> [
1> _Ty1=int,
1> _Ty2=int
1> ]
1> Standard conversion from pointer-to-member of base to pointer-to-member of derived is not applied for template arguments据我了解,在微软的VS2010实现中,Pr::first实际上是_Pair_base的一员。然而,AFAIK,这无关紧要。&Pr::first仍必须是int Pr::*类型。请注意,以下代码可以很好地编译:
int Pr::* x = &Pr::first;那么,它是否是非标准的std::pair实现、编译器错误或非标准代码?
发布于 2011-05-06 16:00:54
该标准对C++03和C++11中的配对提供了清晰的定义,该配对包含两个成员属性,并提供了配对的确切代码。我会认为这种行为(将成员移动到基类)违反了合同,因为根据标准,您的代码是有效的,并且它被实现拒绝了。
因此,在这种情况下,VC2010的实现并不符合标准。
发布于 2011-05-06 15:48:50
该标准不允许在匹配模板参数时进行任何转换(查找标准段落,将在中进行编辑)。
typedef std::pair<int,int> Pr;
X<Pr, int, &Pr::first> var;这将X实例化为(为简洁起见,省略了std::)
X<pair<int,int>, int, int pair<int,int>::*>但是&Pr::first的静态类型是
int _Pair_base<int,int>::*因此,编译器需要执行如错误中所示的转换。我不知道gcc到底是如何实现std::pair的,但它似乎没有继承。我会查一查,再编辑一遍。
发布于 2011-05-08 15:13:24
是的,这是个bug。在以下位置找到错误报告:
http://connect.microsoft.com/VisualStudio/feedback/details/558993/std-pair-members-are-not-members-of-std-pair
https://stackoverflow.com/questions/5908278
复制相似问题