2013-03-10 34 views
2

以下是用於生成添加N個向量的表達式模板的代碼,但目前我只查看添加兩個向量。C++ 11模板錯誤消息:「無法調用沒有對象的成員函數」

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[],將當前對象中的矢量與所有基類矢量相加。

任何想法?我不相信其餘的代碼是相關的[編輯:但標題可以找到here,和測試「主」可以找到here,但如果你想看到它,讓我知道。另外,在C++ 11中是否有任何方法來打印出位置類型來調試這類問題?

+0

如果您可以提供一些我們可以嘗試在我們的環境中編譯的完整代碼(包括您實例化這些模板的方式,如果您這樣做),那將是一件好事。這是部分的,並且可能很難發現錯誤,而不使用代碼 – 2013-03-10 21:52:46

+0

@AndyProwl:完成,我添加了指向頭文件和實例化文件的鏈接。 – 2013-03-10 21:58:43

+0

@SethCarnegie:很好!我不會發現那一個 – 2013-03-10 22:03:38

回答

5

您不能在decltype中做Base::operator[](i),因爲它不在成員函數的主體中;你必須做this->Base::operator[](i)

+0

這是很熟悉的,對於後代,我試圖找到隱藏在查找規則中的規則。你知道在哪裏嗎? – 2013-12-02 01:25:18

相關問題