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

10
我将使用这个方法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)


在g++ 4.7.3中无法运行。我想知道这是否是g++的一个错误。 - R Sahu
@RSahu,对我来说使用4.7.3很好。 - Jonathan Wakely
1
注意:这个问题并不是关于分离声明和定义的,而是关于显式实例化语法的。如果所有内容都在头文件中,问题和答案基本上是相同的(尽管您可能会使用extern将其变为显式实例化声明,如果它在头文件中)。 - Jonathan Wakely
非常好,感谢您迅速而简洁的回答 :-) - George Skelton
1个回答

10

是的,它是有效的。[temp.explicit] 第3段说:

如果显式实例化是用于函数或成员函数,则在声明中的未限定的id必须是一个template-id,或者在所有模板参数都可以被推导时为template-name或operator-function-id。

你的函数有一个模板参数,它可以从函数参数中推导出来,当函数参数是int时,模板参数可以被推导为int,因此你可以选择使用template-namef,而不是template-idf<int>。(可选)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接