c – 模板类,友元运算符<< overload
发布时间:2020-12-16 09:30:46 所属栏目:百科 来源:网络整理
导读:我正试图重载“”模板类的运算符.我在.h文件中定义了类,并在.cpp文件中实现了它. /tmp/ccjJIJhO.o: In function `main':main.cpp:(.text+0xad): undefined reference to `std::basic_istreamchar,std::char_traitschar operatorint(std::basic_istreamchar,s
我正试图重载“<<”模板类的运算符.我在.h文件中定义了类,并在.cpp文件中实现了它.
/tmp/ccjJIJhO.o: In function `main': main.cpp:(.text+0xad): undefined reference to `std::basic_istream<char,std::char_traits<char> >& operator>><int>(std::basic_istream<char,std::char_traits<char> >&,FeatureVector<int>&)' main.cpp:(.text+0xba): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& operator<< <int>(std::basic_ostream<char,FeatureVector<int> const&)' collect2: ld returned 1 exit status 类定义: COMMON.H #include <iostream> using namespace std; featurevector.h #ifndef FEATURE_VECTOR_H #define FEATURE_VECTOR_H #include <common.h> template < class FEAT_TYPE > class FeatureVector; template < class FEAT_TYPE > istream & operator >> (istream &,FeatureVector<FEAT_TYPE> &); template < class FEAT_TYPE > ostream & operator << (ostream &,const FeatureVector<FEAT_TYPE> &); template < class FEAT_TYPE > class FeatureVector{ public: FeatureVector(int = 0); ... friend istream & operator >> <>(istream &,FeatureVector<FEAT_TYPE> & ); friend ostream & operator << <>(ostream &,const FeatureVector<FEAT_TYPE> &); ... ~FeatureVector(); private: int m_nDim; FEAT_TYPE * m_pFeat; }; #endif featurevector.cpp #include <featurevector.h> ... template < class FEAT_TYPE > istream & operator >> (istream & input,FeatureVector< FEAT_TYPE> & refFeat ){ int d; for(d=0; d < refFeat.getDim(); d++){ input >> refFeat.m_pFeat[d]; } return (input); } template < class FEAT_TYPE > ostream & operator << (ostream & output,const FeatureVector< FEAT_TYPE > & refFeat ){ int d; for(d=0; d < refFeat.getDim(); d++){ output << refFeat.m_pFeat[d] << " "; } output << endl; return (output); } ... #include "featurevector-impl.cpp" featurevector-impl.cpp template class FeatureVector<int>; //template istream & operator >> <>(istream &,FeatureVector<int> &); //template ostream & operator << <>(ostream &,const FeatureVector<int> &); mylib.h #ifndef MY_LIB_H #define MY_LIB_H #include <featurevector.h> #endif main.cpp中 #include <mylib.h> #include <common.h> int main(){ FeatureVector<int> pFeat(10); cin >> (pFeat); cout << (pFeat); return (0); } Makefile与“mylib”相关联 INC=./inc SRC=./src LIB=./lib OBJ=./obj CC=g++ CFLAGS=-O3 -Wall mylib: $(LIB)/mylib.a echo "mylib was created!..." $(LIB)/mylib.a: $(OBJ)/featurevector.o ar csr $(LIB)/mylib.a $(OBJ)/featurevector.o $(OBJ)/featurevector.o: $(SRC)/featurevector.cpp $(CC) -c $(CFLAGS) $(SRC)/featurevector.cpp -I$(INC) -o $(OBJ)/featurevector.o clean: rm -rf $(LIB)/*.a rm -rf $(OBJ)/*.o main.cpp的Makefile(带有Makefile的main.cpp位于“app”目录下) LIB=../lib INC=../inc OBJ=../obj BIN=../bin CC=g++ CFLAGS=-O3 -Wall LFLAGS=-lmylib -lm $@.cpp: $(LIB)/mylib.a $@.cpp cd ..; make; cd app; $(CC) $(CFLAGS) $@.cpp -o $(BIN)/$@ -I$(INC) -L$(LIB) $(LFLAGS) clean: rm -rf $(BIN)/* 解决方法
根据
this,您必须在类定义中将该函数称为模板.
class.h #include <iostream> using std::ostream; template <typename T> class A { public: ... template <typename J> // <-- CAUTION! friend ostream &operator<<(ostream &output,const A<J> &a); }; class.cpp #include "class.h" ... template <typename T> ostream &operator<<(ostream &output,const A<T> &a) { // Your implementation return output; } ... template ostream &operator<<(ostream &output,const A<int> &a); template ostream &operator<<(ostream &output,const A<float> &a); 如果行模板< typename J>被删除,编译错误“欠定参考”来了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |