2010-12-13 78 views
2

我的第一个模板类尝试从一些boost提升compressed_matrix到PETSc稀疏AIJ格式的简化转换器,但我最初遇到迭代器typedef的问题。所以T是compressed_matrix,天真地使用下面的代码会导致编译时错误,应该如何定义这些迭代器。我应该在此模板的详细或许读有点...如何获取迭代器,如果模板类型是模板本身?

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

你必须明确地告诉编译器T::iterator1是一个类型名(而不是一个静态变量,或类似的规定)。

typedef typename T::iterator1 i1_t;

+0

其实似乎有一个更根本的问题,THX的信息BTW,模板功能需要连接到PETSc的库函数,然而,这是一个仅有头文件,它是不是在所有的编译。那么是否还有一个解决方案,如模板的单独实现和头文件策略。 – 2010-12-13 15:15:35