OccupyMars2025 / dengjunhui-data-structure

1 stars 0 forks source link

[SOLVED] undefined reference to XXX (You had better put the definitions of C++ templates in header files) #2

Open OccupyMars2025 opened 9 months ago

OccupyMars2025 commented 9 months ago
......dengjunhui-data-structure-cpp-source-code/src/Vector$ make all
c++ -pedantic-errors -Wextra -Werror -I../ -c Vector_insert.cpp -MMD -o build/objects/./Vector_insert.o
c++ -pedantic-errors -Wextra -Werror -o ./build/apps/program build/objects/./main.o build/objects/../UniPrint/print_basic.o build/objects/../UniPrint/print_BinNode.o build/objects/../UniPrint/print_BinTree.o build/objects/../UniPrint/print_BTree.o build/objects/../UniPrint/print_Entry.o build/objects/../UniPrint/print_GraphMatrix.o build/objects/../UniPrint/print_Hashtable.o build/objects/../UniPrint/print_HuffChar.o build/objects/../UniPrint/print_implementation.o build/objects/../UniPrint/print_PQ_ComplHeap.o build/objects/../UniPrint/print_PQ_LeftHeap.o build/objects/../UniPrint/print_PQ_List.o build/objects/../UniPrint/print_Quadlist.o build/objects/../UniPrint/print_Skiplist.o build/objects/../UniPrint/print_traversable.o build/objects/./permute.o build/objects/./Vector_assignment.o build/objects/./Vector_bracket.o build/objects/./Vector_bubbleSort_A.o build/objects/./Vector_bubbleSort_B.o build/objects/./Vector_bubbleSort_C.o build/objects/./Vector_constructor_by_copying.o build/objects/./Vector_deduplicate_1.o build/objects/./Vector_deduplicate.o build/objects/./Vector_deduplicate_wrong_1.o build/objects/./Vector_expand.o build/objects/./Vector_find.o build/objects/./Vector_heapSort.o build/objects/./Vector_implementation.o build/objects/./Vector_insert.o build/objects/./Vector_merge.o build/objects/./Vector_mergeSort.o build/objects/./Vector_partition_DUP.o build/objects/./Vector_partition_LGU.o build/objects/./Vector_partition_LUG.o build/objects/./Vector_quickSort_iterative.o build/objects/./Vector_quickSort_recursive.o build/objects/./Vector_remove.o build/objects/./Vector_removeInterval.o build/objects/./Vector_search_binary_A.o build/objects/./Vector_search_binary_B.o build/objects/./Vector_search_binary_C.o build/objects/./Vector_search.o build/objects/./Vector_search_fibonaccian_A.o build/objects/./Vector_search_fibonaccian_B.o build/objects/./Vector_selectionSort.o build/objects/./Vector_shellSort.o build/objects/./Vector_shrink.o build/objects/./Vector_sort.o build/objects/./Vector_traverse.o build/objects/./Vector_uniquify.o build/objects/./Vector_uniquify_slow.o build/objects/./Vector_unsort.o -L/usr/lib -lstdc++ -lm
/usr/bin/ld: build/objects/./main.o: in function `void testVector<int>(int)':
main.cpp:(.text._Z10testVectorIiEvi[_Z10testVectorIiEvi]+0x9b): undefined reference to `Vector<int>::insert(int, int const&)'
collect2: error: ld returned 1 exit status
make: [Makefile:31: build/apps/program] Error 1 (ignored)

you can see this commit:

https://github.com/OccupyMars2025/dengjunhui-data-structure-cpp-source-code/commit/86812da528323b92a11607d5b05ed34afc212143

cause: I change the header files that implement one method of the template class Vector to ".cpp" files

Screenshot from 2023-12-11 20-33-05

detailed explanation:

https://zhuanlan.zhihu.com/p/81681440

如果把模板函数写进了实现文件.cpp中,那么编译器就会认为这是一个独立的编译单元进行编译。然而,因为它是模板函数,编译器不能确定到底要将它特化到哪个实现(是特化成int的,还是float的,还是别的什么类型),编译器也不会搜索你的整个工程里面别的cpp来确定特化什么类型(要搜索得话,万一你有10000000个.cpp呢?),所以干脆就没有特化,所以你在链接的时候就找不到该函数的定义了,也就是"undefined reference to XXX"。

C++模板的定义是否只能放在头文件中?

原理:C++为什么一般把模板实现放入头文件