用于分隔C++模板函数的声明和定义的正确格式

Geo*_*ton 9 c++ templates language-lawyer

我正在使用这个方法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);
Run Code Online (Sandbox Code Playgroud)
// 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
Run Code Online (Sandbox Code Playgroud)

但是,如果省略尖括号中的类型,似乎专门化也有效,因为我认为编译器从参数类型推导出它:

template void f(int t);
Run Code Online (Sandbox Code Playgroud)

但我想知道,这样做有效吗?

Visual C++ 12(2013)

Jon*_*ely 10

是的,它是有效的.[temp.explicit] p3说:

如果显式实例化一个函数或成员函数,该unqualified- ID声明应是一个模板id或者,所有模板参数可以推断,一个模板名称运营商功能-ID.

你的函数有一个模板参数,它可以从函数的参数,当函数参数可以推断int模板参数可以推断为int,这样你就可以(可选)使用模板的名称,f的,而不是模板id f<int>.