我使用此方法http://www.parashift.com/c++-faq-lite/separate-template-fn-defn-from-decl.html将C ++模板函数的定义与其声明分开,以避免使用代码混乱我的头文件。
该链接使用一个没有参数或返回的函数作为示例,但假设我有一个带参数的函数。该链接将建议以下安排:
// File "f.h"
template <typename T> void f(T t);
// File "f.cpp"
#include "f.h"
template <typename T> void f(T t) {
// do something
}
template void f<int>(int t);
// other specializations as needed
然而,如果省略尖括号中的类型,似乎专门化也有效,因为我认为编译器从参数类型推导出它:
template void f(int t);
但我想知道,这样做有效吗?
Visual C ++ 12(2013)
答案 0 :(得分:10)
是的,这是有效的。 [temp.explicit] p3说:
如果显式实例化是针对函数或成员函数,则不合格 - 声明中的id 应为 template-id ,或者,如果可以推导出所有模板参数,则 template-name 或 operator-function-id 。
你的函数有一个模板参数,它可以从函数参数中推导出来,当函数参数为int
时,模板参数可以推导为int
,这样你就可以(可选)使用 template-name ,f
,而不是 template-id f<int>
。