gpt4 book ai didi

c++ - 模板类,友元运算符 << 重载

转载 作者:太空狗 更新时间:2023-10-29 20:18:24 24 4
gpt4 key购买 nike

我正在尝试为模板类重载“<<”运算符。我在 .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, std::char_traits<char> >&, FeatureVector<int> const&)'
collect2: ld returned 1 exit status

类定义:

通用.h

#include <iostream>
using namespace std;

特征向量.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

特征向量.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);
}

与“mylib”关联的 Makefile

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(main.cpp 及其 Makefile 在“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);
};

类.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);

如果行template <typename J>被删除,编译错误“underfined reference”来了。

关于c++ - 模板类,友元运算符 << 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4147399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com