2
私の最初のテンプレートクラスは、簡略化されたコンバータをいくつかのboost_matrixからPETScスパースなAIJフォーマットにしようとしていますが、私はイテレータtypedef declerationsの問題にぶち当たっています。 Tはcompressed_matrixなので、以下のコードを使用すると、コンパイル時にエラーが発生します。代わりにこれらのイテレータをどのように定義すればいいですか?私はあなたが明示的にT::iterator1
はタイプ名(静的変数、またはそれらの線に沿って何かではなく)で、コンパイラに指示する必要があり...このテンプレートによりおそらくテンプレートタイプがテンプレートそのものならイテレータを取得するには?
template <class T, class T1>
int converter<T, T1>::convertMBo2Pe(const T& A,
T1 A_){
PetscErrorCode ierr;
int cntNnz = 0;
typedef T::iterator1 i1_t;
typedef T::iterator2 i2_t;
//int nnz[ooFelieMatrix.size1()];
int nnz[A.size1()];
unsigned ind=0;
//get information about the matrix
double* vals = NULL;
for (i1_t i1 = A.begin1(); i1 != A.end1(); ++i1)
{
nnz[ind] = distance(i1.begin(), i1.end());
ind++;
}
// create the matrix depending
// on the values of the nonzeros
// on each row
ierr = MatCreateSeqAIJ(PETSC_COMM_SELF, A.size1(),
A.size2(), cntNnz, nnz,
A_);
PetscInt rInd = 0, cInd=0;
PetscInt* rCount, dummy;
rCount = &dummy;
// pointer to values in a row
PetscScalar* valsOfRowI = NULL;
PetscInt* colIndexOfRowI = NULL;
PetscInt rC = 1;
for(i1_t i1 = A.begin1(); i1 != A.end1(); ++i1)
{
// allocate space for the values of row I
valsOfRowI = new PetscScalar[nnz[rInd]];
colIndexOfRowI = new PetscInt[nnz[rInd]];
for(i2_t i2 = i1.begin(); i2 != i1.end(); ++i2)
{
colIndexOfRowI[cInd] = i2.index2();
valsOfRowI[cInd] = *i2;
cInd++;
}
// setting one row each time
*rCount = rInd;
MatSetValues(A_, rC, rCount, nnz[rInd],
colIndexOfRowI, valsOfRowI,
INSERT_VALUES);
// delete
delete [] valsOfRowI;
delete [] colIndexOfRowI;
rInd++; cInd = 0;
}
//
MatAssemblyBegin(A_, MAT_FINAL_ASSEMBLY);
MatAssemblyEnd(A_, MAT_FINAL_ASSEMBLY);
// return
return 0;
}
実際にはもっと根本的な問題があるように思われる、情報のためのTHXはところで、テンプレート関数がPETScライブラリ関数へのリンクが必要ですが、これはヘッダであるファイルのみ、それはまったくコンパイルされていません。テンプレート用の個別の実装とヘッダーファイルの戦略のような回避策もあります。 –