此代码在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 的范围内。
我该如何解决这个问题?
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上验证了它是否有效。