首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有std::if_enabled_t参数的模板函数的完全专门化

带有std::if_enabled_t参数的模板函数的完全专门化
EN

Stack Overflow用户
提问于 2020-04-26 17:30:26
回答 1查看 45关注 0票数 1

我正在尝试编写一个函数,它为所有非枚举类型实现通用行为,为所有枚举类型实现通用行为,然后能够通过完全专门化该函数来专门化某些类型的特定行为。到目前为止,我的代码如下:

代码语言:javascript
复制
// Func.h

#include <cstdio>
#include <type_traits>

template <typename T, std::enable_if_t<!std::is_enum<T>{}>* = nullptr >
void Func()
{
    printf("General case\n");
}

template <typename T, std::enable_if_t<std::is_enum<T>{}>* = nullptr >
void Func()
{
    printf("enum\n");
}

template <>
void Func<bool>()
{
  printf("bool\n");
}


// main.cpp
#include <Func.h>

enum Enum
{
    A,
    B
};

int main()
{
  Func<float>();
  Func<Enum>();
  Func<bool>();
}

它不能编译,我真的不知道如何正确地处理它。如果我让专门化的原型像上面的代码一样,我会得到这个链接错误:

代码语言:javascript
复制
error LNK2005: "void __cdecl Func<bool,0>(void)" (??$Func@_N$0A@@@YAXXZ) already defined in main.obj

如果我制作专门的原型template<> void Func<bool, nullptr>(),我会得到这个编译错误:

代码语言:javascript
复制
error C2912: explicit specialization 'void Func<bool,nullptr>(void)' is not a specialization of a function template

这些测试是使用具有c++14标准的Visual Studio 2015编译器完成的

我不知道接下来该怎么做,任何帮助都将不胜感激

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-26 19:28:16

您会得到一个链接错误,因为Func<bool>()是在包含在多个编译单元中的头文件中定义的。解决方案很简单:将inline放在void Func<bool>()之前

代码语言:javascript
复制
template<>
inline void Func<bool>()
{
    // ...
}

函数模板是隐式的inline,但是函数和显式模板专门化是are not。如果它们是在头文件中定义的,则应该将它们标记为inline

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61438535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档