编译C ++模板代码时出现问题

时间:2009-07-23 08:50:48

标签: c++ templates

我有以下模板:

template<class Matrix> 
Matrix horizontal_join (const Matrix& m1, const Matrix& m2) {

ASSERT (rows (m1) == rows (m2), "unequal number of rows");
typedef typename Matrix::value_type Scalar;
Matrix r (rows (m1), nbcol (m1) + nbcol (m2));
  for (unsigned i=0; i<nbrow(m1); i++) {
      for (unsigned j=0; j<nbcol(m1); j++)
     r(i,j)= m1(i,j);
      for (unsigned j=0; j<nbcol(m2); j++)
     r(i,j+nbcol(m1))= m2(i,j);
  }
  return r;
}

在一些名为“MATRDSE.m”的库中定义。 在文件“matrdse.hpp”中还定义了一个名为“matrsdse”的结构,它代表一种密集矩阵类型,并且有几个

-constructors,例如matrdse(int nrRows,int nrCols,const value_type * src,ByRow())

- 和方法,例如转置()。

我想在main函数中使用“horizo​​ntal_join”模板:

#include <matrdse.hpp>
#include <MATRDSE.m>

typedef matrdse<double> MxPoly;    

int main{

    double v[]={1,2,1,1,3,4,2,2,5,5,5,5,-2, 1,2,3,1, -2.8,-2.4,1,.2,5.8};
matrdse<double> A(4,4,v,ByRow());
std::cout<<"A="<<endl<<A<<endl;
matrdse<double> AT(A);
AT.transpose(); std::cout<<"Transpose(A)="<<endl<<AT<<endl;
MxPoly B;
B=horizontal_join<MxPoly>(A,AT);
cout<<B<<endl;

    return 0;

 }

一切正常,直到调用“horizo​​ntal_join”并在B中返回。 我收到以下编译错误:

 main.cpp:168: error: 'horizontal_join' was not declared in this scope
 main.cpp:168: error: expected primary-expression before '>' token

我不明白这个错误。在我看来,我不知道如何调用模板..

提前感谢您的任何建议, madalina

3 个答案:

答案 0 :(得分:1)

这是实际的代码吗?你有#define(一个坏主意)逆转。它应该是

#define MxPoly matrsde<double>

答案 1 :(得分:0)

我猜问题是这里的预处理器宏的组合(这是否正确,你是否在类型之前有宏的名称?):

#define matrdse<double> MxPoly;

和模板实例化在这里:

B=horizontal_join<MxPoly>(A,AT);

请注意,实例化行在预处理器中扩展为:

B=horizontal_join<matrdse<double>>(A,AT);

>>结尾的模板模板事件是一个众所周知的编译器错误,宏在此处被屏蔽。我想如果你将模板实例化行更改为它就会消失:

B=horizontal_join<MxPoly >(A,AT);

我建议你需要使用一些更一致的命名,并支持typedef over macro,因为它不会有这个问题:

typedef matrdse<double> MxPoly;

答案 2 :(得分:0)

<强> #define matrdse<double> MxPoly;

一个分号到多