【发布时间】:2018-01-09 04:33:35
【问题描述】:
C++ 不会使用 T = Hoge& 来实例化模板。
一个最小的例子:
-
hoge.h:#include<cstdio> class Hoge { public: Hoge() : hoge(0) { } ~Hoge() { } int hoge; void print() { printf("%d\n", hoge); } }; template<typename T> void f(T a); -
hoge.cpp:#include "hoge.h" template<typename T> void f(T a) { a.print(); } template void f<Hoge &>(Hoge &a); -
main.cpp:#include "hoge.h" int main(void) { Hoge h; f(h); return 0; }
我将这些编译为:g++ -std=c++11 main.cpp hoge.cpp。但它给出了一个链接器错误:
Undefined symbols for architecture x86_64:
"void f<Hoge>(Hoge)", referenced from:
_main in aa-e35088.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
接下来,我把main.cpp中的f(h)改成f<Hoge &>,错误就消失了。
为什么在第一种情况下不调用f<Hoge &>(Hoge &)?
对于这种情况,我可以通过每次输入f<Hoge &> 来避免错误。但是,当涉及到重载的运算符时,就无法做到。
请告诉我如何解决这个错误。
【问题讨论】: