2012-10-15 57 views
1

我有一個類模板,它有一個提升矩陣作爲私有成員變量。矩陣數據類型在構造時由類類型確定。這個類有一個成員函數,它應該爲成員矩陣添加一個常量。常數與矩陣數據類型一致。我無法編寫一個重載操作符,它將返回任意常量值的更新成員矩陣。目前,另一個成員函數做了這個補充。我的代碼如下;運算符爲包含boost :: numeric :: ublas :: matrix的類重載

/*content from main.cpp compiled with `g++ -o main main.cpp` */ 
#include <iostream> 
#include <boost/numeric/ublas/matrix.hpp> 
#include <boost/numeric/ublas/io.hpp> 

using namespace boost::numeric::ublas; 
using namespace std; 

template <typename T> 
class MTool 
{ 
private: 
matrix<T> m_ME; 

public: 
MTool(int N, int M) { m_ME.resize(M, N); } // constructor 
~MTool() { m_ME.clear(); } // destructor 
void PutMatValues(); // insert values into member matrix 
void AddConst(const T &k) { m_ME+=k; } // add a constant to member matrix 
void PrintMat() { cout << "The ME " << endl << m_ME << endl; } // print the member matrix 

// overloaded operator function 
matrix<T> operator+ <> (const T& kvalue) { return (m_ME+kvalue); } 
}; 

template<typename T> 
void MTool<T>::PutMatValues() 
{ 
    for (unsigned row=0; row<m_ME.size1(); row++) 
     for (unsigned col=0; col<m_ME.size2(); col++) 
      m_ME(row,col)=static_cast<T> (row*col); 
} 

int main() 
{ 
    MTool<double> mymat(5, 3); 
    double dk=123.67001; 

    mymat.PutMatValues(); 
    mymat.PrintMat(); 
    mymat.AddConst(dk); 
    mymat.PrintMat(); 

    return 0; 
} 

一些編譯器錯誤,我得到的是

error: template-id ‘operator+<>’ in declaration of primary template

error: no match for ‘operator+=’ in ‘((MTool*)this)->MTool::m_ME += k’

我是相當新的C++模板和類。我肯定有一些基本的東西丟失從我的做法。任何建議將不勝感激。

回答

0

第一隻是一個語法錯誤,該成員運算符+將寫作

MTool<T> operator+ (const T& kvalue) const { ... 

雖然這是有點不尋常看到一個二進制加法運算的成員函數:它幾乎總是作爲一個非成員實施,以便您可以編寫表達式c + M以及M + c

第二個錯誤是簡單地指出boost::numeric::ublas::matrix沒有operator+=需要一個標量參數。也沒有可以添加矩陣和標量的operator+,所以運算符+中的m_ME+kvalue表達式也不會編譯。

加法僅限於相同形狀的矩陣之間。如果你要爲矩陣的每一個元素添加標量,你需要寫下如下內容:

void AddConst(const T &k) { 
    for(auto& element : m_ME.data()) 
      element += k; 
} 
相關問題