C++ 模板类和同时也是模板的类属性

C++ 模板类和同时也是模板的类属性,c++,templates,operator-overloading,C++,Templates,Operator Overloading,我在编译以下标题时遇到问题。这是我第一次使用模板,我想我弄错了什么。编译器将错误指向矢量数据和运算符重载函数。我希望数据向量的类型与OptBaseMatrix对象的类型相同,但我不确定如何操作。。。我真的不知道如何解决这个问题。救命啊 #ifndef OPTBASEMATRIX_H #define OPTBASEMATRIX_H #include <vector> template<typename T> class OptBaseMatrix { public:

我在编译以下标题时遇到问题。这是我第一次使用模板,我想我弄错了什么。编译器将错误指向
矢量数据
和运算符重载函数。我希望
数据
向量的类型与
OptBaseMatrix
对象的类型相同,但我不确定如何操作。。。我真的不知道如何解决这个问题。救命啊

#ifndef OPTBASEMATRIX_H
#define OPTBASEMATRIX_H

#include <vector>

template<typename T>
class OptBaseMatrix 
{ 
public:
 vector<vector<T>> data_; 

 OptBaseMatrix(int rows, int cols);
 ~OptBaseMatrix();

 void readMatrix();
 void printMatrix();
 int getRows();
 int getCols();

    OptBaseMatrix<T> operator+(const OptBaseMatrix<T>& matrix1, const OptBaseMatrix<T>& matrix2);

private:
 int rows_; 
 int cols_; 
};

#endif // OPTBASEMATRIX_H
#如果ndef OPTBASEMATRIX
#定义OPTBASEMATRIX_H
#包括
模板
类OptBaseMatrix
{ 
公众:
矢量数据;
OptBaseMatrix(int行、int列);
~OptBaseMatrix();
void readMatrix();
无效打印矩阵();
int getRows();
int getCols();
OptBaseMatrix运算符+(常量OptBaseMatrix和matrix1,常量OptBaseMatrix和matrix2);
私人:
int行;
int cols_;
};
#endif//OPTBASEMATRIX_H
更新:以下是调试器日志中的一个片段:

Error   1   error C2143: syntax error : missing ';' before '<'  optbasematrix.h 17  TD2
Error   2   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   optbasematrix.h 17  TD2
错误1错误C2143:语法错误:缺少“;”在"数据"之前,;通过向量>数据;但仍然得到相同的错误:/I我在某处读到,我的模板类头(.h)和实现(.cpp)必须在同一个文件中。。。这可能有关系吗

更新2:哇!我忘记了“使用名称空间std;”。问题似乎已经解决了

试试看:

vector<vector<T> > data_; 
矢量数据;

您需要在两个
之间留出一个空间

 vector<vector<T> > data_;

这可能会有助于你把你得到的实际错误包括在内。这是一种需要花费数小时或数天才能第一次弄清楚的事情,但你永远不会忘记friend’不仅仅允许您从类curly braces中声明一个自由函数。如果函数是在类括号之外定义的,那么它将允许它访问类的私有成员。如果函数也在类括号内定义,那么它将具有额外的效果,即在参数不属于模板化类的情况下,将其隐藏在添加的查找规则中,这有其自身的优点。。。顺便说一句:通常建议实现操作符+=(必须是成员),然后是调用+=的自由函数操作符+。也许值得注意的是,Bjarne Stroustrup调用了这个-也就是说,不能说vector v,但必须说vectorv-这是C++的“尴尬”之一。例如,你看,随着C++1y的出现,这个问题似乎不会在我们身上存在太久了。
// Member function
Matrix<T> operator+(const Matrix<T>& other) const;

// Free function (`friend` makes the function free
// even though it's declared within the scope of the class definition)
friend Matrix<T> operator+(const Matrix<T>& lhs, const Matrix<T>& rhs);