“ template <>”和“ template”不带括号-有什么区别?


Answers:


70

template <> void foo<int>(int& t);声明模板的特殊化,其主体可能不同。

template void foo<int>(int& t);导致模板的显式实例化,但不引入专门化。它只是强制为特定类型实例化模板。


3
那真是令人困惑!我假设声明的意思是,当找不到专门的定义时,编译器将不会接受未专门模板的实例化为候选对象?
einpoklum 2015年

3
对此进行更多解释:第一个可以在头文件中使用,并说“foo<int>将具有与...不同的主体foo<T>”。如果程序中其他地方的代码调用了foo<int>()但您没有提供正文,则应该收到链接错误。
MM

4
第二个不应在头文件中使用;在一个.cpp文件中使用它可以确保确实处理了主体foo<int>foo<T>除非使用特殊化行,否则将使用模板来生成它!)(这有点像定义非模板函数)。通常情况下,你不需要这么做,因为它随时会发生一些其他的代码调用foo<int>,但你可能想这样做有几个原因
MM

如果您将<>视为空模板参数列表的特例,那么就不会感到困惑。通常,您使用此语法来创建(可能是部分)专业化。如果碰巧没有任何参数(即不是部分参数),它将为您提供该语法。您仍在声明模板
JDługosz

@jdlugosz:我的印象是不支持部分专业化……
einpoklum 2015年

13

有了class / struct,

template <typename T> struct foo {};

以下是专长:

template <> struct foo<int>{};

以下是一个显式实例化:

template struct foo<int>;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.