我已经查看了其他人提出的问题,但没有一个解决方案似乎有效。我对makefile编译不够了解。但这是我的makefile:
program.out: bzstrlib.o DataStructures.o Classes.o main.o
g++ -o program.out bzstrlib.o DataStructures.o Classes.o main.o
bzstrlib.o: bzstrlib.cpp bzstrlib.h
g++ -c bzstrlib.cpp
DataStructures.o: DataStructures.cpp DataStructures.h
g++ -c DataStructures.cpp
Classes.o: Classes.cpp Classes.h
g++ -c Classes.cpp
main.o: main.cpp bzstrlib.cpp bzstrlib.h DataStructures.cpp DataStructures.h Classes.cpp Classes.h
g++ -c main.cpp
clean:
rm *.o program.out
我必须设置错误,因为我不断收到错误消息Classes.o: In function 'Player::dealCard(Card const&)':
Classes.cpp:(.text+0x735): undefined reference to 'List<Card>::gotoEnd()'
collect2: ld returned 1 exit status.
Player
在Classes
中定义,List<>::gotoEnd()
在DataStructures
中定义。
令我困惑的是,在调用gotoEnd()
之后的行上就是对同一标头中定义的另一个函数的调用。如果我注释掉gotoEnd()
调用,那么即使其他函数存在,我也没有编译器错误。
我有7个文件:
Main.cpp:#include
s“Classes.h”和“DataStructures.cpp”
bzstrlib.h:不包含任何标题
DataStructures.h:不包含任何标题
Classes.h:#include
s“DataStructures.h”
bzstrlib.cpp:#include
s“bzstrlib.h”
DataStructures.cpp:#include
s“DataStructures.h”
Classes.cpp:#include
s“bzstrlib.h”,“Classes.h”和“DataStructures.h”
答案 0 :(得分:0)
如果List<>::gotoEnd
的实际实现位于DataStructures.cpp
,那么您可能遇到的问题是编译器尚未实例化List<Card>::gotoEnd()
。您必须要求它明确地。
您可以通过将以下行添加到List<Card>
来强制编译器为DataStructures.cpp
发出实现:
template class List<Card>;
这称为显式实例化,当模板化类的部分或全部实现与标头位于不同的.cpp
文件中时,某些编译器需要这样做。更多信息:http://en.cppreference.com/w/cpp/language/class_template(向下滚动到显式实例化)。