当前位置: 首页 > 知识库问答 >
问题:

const指针特化使用MSVC生成未解析符号,并且适用于GCC/Clang

鱼宜
2023-03-14

请查看以下代码:

// header.h
#pragma once

template <typename T>
void test(T*);
// lib.cpp
#include "header.h"

template <>
void test(int* const)
{
}
// main.cpp
#include "header.h"

int main() {
  int* ptr = nullptr;
  test(ptr);
}

gcc和clang编译并链接它时没有任何问题,而MSVC(2015、2019)生成了未解决的外部符号“void _cdecl test(int*)”

请注意,如果从库中删除const关键字。cpp然后MSVC链接代码。

谁在这里?是MSVC的错误吗?

共有1个答案

平山
2023-03-14

该程序格式不正确,无需诊断。

[temp.expl.spec]/6如果模板、成员模板或类模板的成员是显式特化的,那么该特化应在第一次使用该特化之前声明,这将导致隐式实例化发生,在发生此类使用的每个翻译单元中;不需要诊断。

 类似资料:
  • 下面是一个非常简单的C代码: 更令人震惊的是,这段代码显示了GCC、Clang和MSVC之间不同的结果。 我试过4个编译器 > GCC:编译良好,打印。 叮当声:编译良好,打印。 MSVC(在线):编译失败。 带有Visual Studio 2019的MSVC(本地):编译良好,打印。(有趣的是,如果我删除,它会打印。) 我不确定指向成员的指针及其自己的成员的类内初始化是否合法,但我相信这段代码应

  • 我正在进入一个比赛的分钟,但在第一天的编码,我得到的错误,你可以看到的问题,以及我的项目不能建立 如果你需要更多的截图只管问。

  • 4. 指针与const限定符 const限定符和指针结合起来常见的情况有以下几种。 const int *a; int const *a; 这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。 int * const a; a是一个指向int型的const指针,*a是可以改写的,但a不允许改写。 in

  • 本文向大家介绍C# 解析 Excel 并且生成 Csv 文件代码分析,包括了C# 解析 Excel 并且生成 Csv 文件代码分析的使用技巧和注意事项,需要的朋友参考一下 今天工作中遇到一个需求,就是获取 excel 里面的内容,并且把 excel 另存为 csv,因为本人以前未接触过,所以下面整理出来的代码均来自网络,具体参考链接已丢失,原作者保留所有权利! 例子: ExcelUtils.cs

  • 最近,我开始用MSVC编译一段代码,这段代码总是用GCC和Clang编译的。这段代码产生了一个有趣的编译错误(被截断): 这段代码的最小示例: 使用Clang 11成功编译:https://godbolt.org/z/o6Ge85rxG 使用GCC 12成功编译:https://godbolt.org/z/x1rhqhfGT MSVC 19出错:https://godbolt.org/z/4jMY

  • 概念 在我们了解了指针的基本概念之后,接下来我们来看一下指针和C中给我们提供的关键字中的类型修饰符它们之间的关系。指针就是存储地址的一种特殊变量。那这个变量跟我们的修饰符之间还有哪些更深层次的符号限制呐?我们在实际开发过程中,经常会运用修饰符,把指针的这种限制范围更明确的告诉给用户,通过不同修饰符告诉给用户指针的具体属性。 指针变量也是一个变量,它可以改变存储的地址,指向一个地方再指向另外一个地方