2010-12-13 4 views
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; 
} 

答えて

1

をビットをお読みください。

typedef typename T::iterator1 i1_t;

+0

実際にはもっと根本的な問題があるように思われる、情報のためのTHXはところで、テンプレート関数がPETScライブラリ関数へのリンクが必要ですが、これはヘッダであるファイルのみ、それはまったくコンパイルされていません。テンプレート用の個別の実装とヘッダーファイルの戦略のような回避策もあります。 –

関連する問題