类成员函数的Decltype

时间:2014-02-14 15:08:46

标签: c++ visual-studio-2010 c++11 decltype

此代码无法在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中的范围内。

我该如何解决这个问题?

1 个答案:

答案 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上验证了它的工作原理。