此代码无法在VS2010中编译:
template < typename A >
class X
{
A& m_a;
public:
X ( A& a ) : m_a ( a ) {}
auto func ( int i ) -> decltype ( m_a ( i ) ) { return ( m_a ( i ) ); } // failing on this line
};
double f ( int a )
{
return static_cast < double > ( a );
}
int main()
{
X < decltype ( f ) > x ( f );
std::cout << x.func(4) << std::endl;
return 0;
}
我得到的错误是:错误C2064:term不评估为带有1个参数的函数。
似乎编译器不认为m_a在decltype中的范围内。
我该如何解决这个问题?
答案 0 :(得分:3)
VS2010没有完全按照标准规定实现decltype
(公平地说,它比标准的最终版本更旧)。你应该能够用手写declval
:
template < typename A >
class X
{
A& m_a;
static A& simulated_m_a();
public:
X ( A& a ) : m_a ( a ) {}
auto func ( int i ) -> decltype ( simulated_m_a()( i ) ) { return ( m_a ( i ) ); }
};
我刚刚在VS2010上验证了它的工作原理。