提问人:canellas 提问时间:3/24/2023 更新时间:3/24/2023 访问量:159
当专用化位于不同的标头中时出现 C++ 模板函数专用化错误
C++ template function specialization error when specialization is in different header
问:
在标头中,有:cnvt.h
template <typename t_to, typename t_from> std::optional<t_to> cnvt(t_from);
在标题中,我们有:int.h
#include "cnvt.h"
template <>
std::optional<uint8_t> cnvt<uint8_t, const char *>(const char *) {
// actual code replaced for simplicity
return {};
}
照原样,报告clang-tidy
clang 报告“int.h::包含的标头 cvnt.h 不直接使用 (可修复)包含的标头 cvnt.h 不直接使用(修复 可用)
如果删除,它会报告#include "cnvt.h"
int.h:9:24:没有函数模板与函数模板专用化“cnvt”匹配
我搜索了 StackOverflow,关于函数模板专业化的帖子没有帮助。
答:
5赞
TartanLlama
3/24/2023
#1
此警告来自 clangd 而不是 clang-tidy。对于您编写的代码,您确实需要包含标头。Clangd 只是没有看到您需要该标头中的主模板才能进行专业化。cnvt.h
从 clangd 文档中:
我以一种棘手的方式(例如通过模板)使用符号,但标题被标记为未使用
分析无法找到某些类型的用途。
禁止显示警告
// IWYU pragma: keep
因此,您应该能够通过在 include 后添加 来抑制警告。// IWYU pragma: keep
cnvt.h
但是,如果可以的话,我建议您完全回避问题并使用函数重载而不是模板专用化:
std::optional<uint8_t> cnvt(const char *) {
// actual code replaced for simplicity
return {};
}
这样就无需在标题中显示主模板。int.h
评论
2赞
Jarod42
3/25/2023
关于建议,是不可推导的,因此用法类似于与您的版本不兼容。t_to
cnvt<std::uint8_t>(some_text)
评论