我很清楚模板函数基本上是在有特定调用时编译的。但在这个问题上,我正在寻找不同的东西。
我有以下源文件:
a.cpp:
template <class T>
void g(T x) {
cout<<x<<" g#1\n" ;
}
void f() ;
main() {
g(10) ;
g('c') ;
f() ;
}
b.cpp:
template <class T>
void g(T x) {
cout<<x<<" g#2\n" ;
}
void f() {
g(11) ;
}
现在我将代码编译为:
g++ a.cpp b.cpp
通过a.cpp中定义的模板函数解决了对g的所有三次调用(main中的2次和函数中的一次&#39; f&#39;)。
但是当我将代码编译为:
时g++ b.cpp a.cpp
main中的调用g(10)和函数中的g(11)f&#39; f&#39;通过b.cpp中定义的模板函数解析,而main中的调用g(&#39; c&#39;)通过a.cpp中定义的模板函数解析
当然,如果删除了两个文件中定义的模板函数,则该特定文件会报告编译器错误。
有人可以提供所有这些观察的解释
特别是我想知道在目标文件生成a.o和b.o期间发生了什么样的函数调用解析。我的询问是关于如何在编译时解决调用,即当我说:
g++ -c a.cpp
和
g++ -c b.cpp
然后当我说:
时会发生什么g++ a.o b.o