我們來試一下:
mian.cpp:
#include <iostream>
extern int int_add(int a, int b);
extern int int_sub(int a, int b);
int main(int argc, char **argv)
{
int a = 10;
int b = 7;
int result = int_add(a,b);
std::cout<<"int_add result:"<<result<<std::endl;
result = int_sub(a,b);
std::cout<<"int_sub result:"<<result<<std::endl;
return 0;
}
t1.cpp:
template <typename T> T add(T a, T b)
{
return a + b;
}
int int_add(int a, int b)
{
return add(a,b);
}
t2.cpp:
template <typename T> T add(T a, T b)
{
return a - b;
}
int int_sub(int a, int b)
{
return add(a,b);
}
編譯運行的結果如下:
int_add result:17
int_sub result:17
可見int_sub沒有鏈接自己的模板。我們再看看如果不把t1.cpp鏈接進來會怎樣。
把main.cpp改爲:
#include <iostream>
//extern int int_add(int a, int b);
extern int int_sub(int a, int b);
int main(int argc, char **argv)
{
int a = 10;
int b = 7;
//int result = int_add(a,b);
//std::cout<<"int_add result:"<<result<<std::endl;
int result = int_sub(a,b);
std::cout<<"int_sub result:"<<result<<std::endl;
return 0;
}
編譯運行結果:
int_sub result:3
這次就鏈接了t2.cpp裏的模板了。
不過我的問題是,我是在Mac下編的,竟然連個警告都沒有。在實踐中怎樣規避這樣的風險呢?是否尅通過命名空間來規避呢?我們看看增加命名空間後會怎樣。
main.cpp:
#include <iostream>
namespace t1{
extern int int_add(int a, int b);
}
namespace t2{
extern int int_sub(int a, int b);
}
int main(int argc, char **argv)
{
int a = 10;
int b = 7;
int result = t1::int_add(a,b);
std::cout<<"int_add result:"<<result<<std::endl;
result = t2::int_sub(a,b);
std::cout<<"int_sub result:"<<result<<std::endl;
return 0;
}
t1.cpp:
namespace t1{
template <typename T> T add(T a, T b)
{
return a + b;
}
int int_add(int a, int b)
{
return add(a,b);
}
}
t2.cpp:
namespace t2{
template <typename T> T add(T a, T b)
{
return a - b;
}
int int_sub(int a, int b)
{
return add(a,b);
}
}
編譯運行:
int_add result:17
int_sub result:3
這次正常了。