Специализация const указатель создает неразрешенный символ с MSV C и хорошо с GCC / Clang - PullRequest
1 голос
/ 25 апреля 2020

Пожалуйста, посмотрите на следующий код:

// 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);
}

И g cc, и clang компилируют и связывают его без проблем, пока MSV C (2015, 2019 ) создает неразрешенный внешний символ «void __cdecl test (int *)»

, обратите внимание, что если ключевое слово const удалено из lib. cpp, то MSV C связывает код в порядке.

Who прямо здесь? Это ошибка MSV C?

1 Ответ

2 голосов
/ 25 апреля 2020

Эта программа некорректна, диагностика не требуется c не требуется.

[temp.expl.spec] / 6 Если шаблон, шаблон элемента или член шаблона класса является явно специализированным, тогда эта специализация должна быть объявлена ​​до первого использования этой специализации, которая могла бы вызвать неявное создание экземпляра в каждой единице перевода, в которой происходит такое использование; Диагностика не требуется c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...