C++ 11模板错误消息:"无法调用无对象的成员函数"

And*_*ott 3 c++ templates c++11

以下是用于生成用于添加N个向量的表达式模板的代码,但是目前我只关注添加两个向量.

template < typename Operation, typename Va>
struct VectorExpression < Operation, Va >
{
    friend Va;
    typedef VectorExpression< Operation, Va> This;
    const Operation& op;
    const Va& vector;

    inline VectorExpression ( Operation oper, const Va& first) : op(oper), vector(first) {};

    inline auto size() const ->decltype( vector.size() ) {
        return vector.size();
    };

    inline auto operator[]( size_t i ) const 
        ->decltype( vector[i] ) {
        return vector[i];
        };
};

template < typename Operation, typename Va, typename ... Vs >
struct VectorExpression <Operation, Va, Vs...> : protected VectorExpression< Operation, Vs...>
{
    friend Va;
    typedef VectorExpression< Operation, Va, Vs...> This;
    typedef VectorExpression< Operation, Vs... > Base;
    const Operation op;
    const Va& vector;

    inline VectorExpression ( Operation oper, const Va& first, const Vs&... vs ) : VectorExpression< Operation, Vs...>(oper, vs...), op(oper), vector(first) {};

    inline auto size() const ->decltype( vector.size() ) {
        return vector.size();
    };

    inline auto operator[]( size_t i ) const //This line is where the error says it is happening
        ->decltype( op( vector[i], Base::operator[](i) ) ) {
        return op( vector[i], Base::operator[](i) );
        };
};
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我尝试编译前面的内容时,我收到以下错误消息:

error: cannot call member function 'decltype (((const VectorExpression<Operation, Va>*)this)->VectorExpression<Operation, Va>::vector[i]) 
    VectorExpression<Operation, Va>::operator[](size_t) const 
    [with 
        Operation = adder<std::complex<double>, double>; 
        Va = Vector<double, false>; 
        decltype (((const VectorExpression<Operation, Va>*)this)->VectorExpression<Operation, Va>::vector[i]) = const double&; size_t = long unsigned int]'  without object
Run Code Online (Sandbox Code Playgroud)

我不确定问题出在哪里.它似乎是一个相当简单的递归定义operator[],在当前对象中添加了所有基类向量的向量.

有任何想法吗?我不相信其余代码是相关的[编辑:但是标题可以在这里找到,测试"主"可以在这里找到,但是如果你想看到它,请告诉我.另外,在C++ 11中是否有任何方法可以在调试此类问题的位置打印出类型?

Set*_*gie 5

你不能这样做Base::operator[](i),decltype因为它不在成员函数体内; 你必须这样做this->Base::operator[](i).