1

プライベートメンバー変数としてブースト行列を持つクラステンプレートがあります。マトリックスデータ型は、構築時にクラスタイプによって決定されます。このクラスには、メンバー行列に定数を追加することになっているメンバー関数があります。定数は、マトリックスのデータ型と一致しています。任意の定数値に対して更新されたメンバー行列を返すオーバーロードされた演算子を作成するのに問題があります。現在、別のメンバー関数がこの追加を行います。私のコードは次のとおりです。

/*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; 
} 

私が得るコンパイラエラーのいくつかは

エラー:プライマリテンプレートの宣言にあるtemplate-id'operator +<>'

エラー:'((MTool *)this)-> MTool :: m_ME + =k'</p>の'operator+='に一致しません

私はC++テンプレートとクラスにかなり慣れていないので、私のアプローチには根本的な何かが欠けていると確信しています。任意の提案をいただければ幸いです。

4

1 に答える 1

0

1 つ目は単なる構文エラーです。このメンバ operator+ は次のように記述されます。

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

二項プラス演算子をメンバー関数として見るのは少し珍しいですが、ほとんどの場合、非メンバーとして実装されているためc + MM + c.

2 番目のエラーは、スカラー引数を取るboost::numeric::ublas::matrixnoを単に指摘しているだけです。行列とスカラーを追加できるoperator+=ものもないため、 operator+ の式もコンパイルされません。operator+m_ME+kvalue

加算は、同じ形状の行列間でのみ定義されます。行列のすべての要素にスカラーを追加する場合は、次のように記述する必要があります。

void AddConst(const T &k) {
    for(auto& element : m_ME.data())
           element += k;
}
于 2012-10-16T03:20:45.110 に答える