4

以下は、N 個のベクトルを追加するための式テンプレートを生成するためのコードですが、現在は 2 つのベクトルの追加のみを検討しています。

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) );
        };
};

残念ながら、上記をコンパイルしようとすると、次のエラー メッセージが表示されます。

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

問題がどこにあるのかわかりません。の非常に単純な再帰的定義のように見えoperator[]、現在のオブジェクトにベクトルをすべての基本クラスのベクトルに追加します。

何か案は?コードの残りの部分が関連しているとは思いません[編集: ただし、ヘッダーはここにあります。テストの「メイン」はここにありますが、見たい場合はお知らせください。また、C++11 で、この種の問題をデバッグする場所に型を出力する方法はありますか?

4

1 に答える 1

6

メンバー関数の本体ではないため、でBase::operator[](i)行うことはできません。decltypeあなたがしなければならないthis->Base::operator[](i)

于 2013-03-10T22:04:27.773 に答える