插入功能模板专业化
Inlining a function template specialization
以下代码在.h文件中(包含后卫)
template<typename T1, typename T2> // a
void func(T1 const &t1, T2 const &t2)
{
std::cout << "nbase template";
}
template<> // b
inline void func<int, int>(int const &t1, int const &t2)
{
std::cout << "nspecialization for integers";
}
从(b)中删除内联关键字时(从包含.h包含.h)的A级代码不会编译
func<int, int>(1, 2);
启动链接器错误"错误lnk2005:" void __cdecl func(int const&amp;,int const&amp; amp; amp; amp; amp; amp;)(??>
为什么会发生这种情况?
编辑:
因此,由于它们是定义(由Luchian Grigore回答),因此明确的专业化意味着明确的实例化还是该编译器是特定的?
,因为显式专业是定义,因此在多个翻译单元中包含该文件会导致多次定义符号,这打破了一个定义规则。
除了标记inline
外,您还可以将声明放在标题中并将定义移至实现文件。
您只能用类型本身直接覆盖它,而无需编写模板:
void func(int const &t1, int const &t2)
{
std::cout << "nspecialization for integers";
}
现在,发生错误是因为该函数如果在标头中定义的功能,则可以在两个CPP文件中结束,如果包含标头,则将有两个声明相同函数的声明(如错误说: already defined
),从而导致链接错误。为了解决此问题,只需在没有实现的情况下将声明编写在标题中,然后将实现在一个标题文件中移动:
//header
void func(int const &t1, int const &t2);
//cpp file
void func(int const &t1, int const &t2)
{
...
}
相关文章:
- 类模板的成员功能的定义在单独的TU中完全专业化
- 特定好友功能专业化
- 如何部分专业化功能以用元组元素作为参数调用功能
- 功能模板参数包,然后是模板参数和专业化
- 不允许功能模板的部分专业化背后的理由是什么?
- 在此功能[ - wuninitialization]中使用非专业化
- 模板专业化的情况下,如果有变态模板功能
- 如何在另一个名称空间内从另一个命名空间内明确专业化功能模板
- 为什么VS2017拒绝我的功能模板专业化,而不是VS2015拒绝
- 仅适用于单个功能的部分模板专业化
- 功能模板专业化具有模板打字名称
- 对完整模板专业类成员功能的未定义引用,但不是部分专业化
- 特定模板类型的功能模板专业化
- 功能模板专业化中的bool返回值
- C 将lambda函数用作模板功能专业化
- 如何正确设计和实施功能模板专业化
- Clang无法在模板类专业化中编译模板功能,该模板类专业化与模板声明具有 *不同的返回类型 *
- 统一功能使用模板专业化和接口来调用实例和原始类型
- 当使用Tempate作为参数时,功能模板专业化
- 模板功能实例化和专业化