С++ не создает шаблоны, скажем 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)
Затем я изменил f(h)
в main.cpp
на f<Hoge &>
, и ошибка исчезла.
Почему f<Hoge &>(Hoge &)
не вызывается в первом случае?
В этом случае я могу избежать ошибок, набирая f<Hoge &>
каждый раз. Но, когда дело доходит до перегруженных операторов, это не может быть сделано.
Скажите, пожалуйста, как решить эту ошибку.