Следующий код компилируется и работает правильно в macOS, используя Clang, но не в Windows, используя MSVC 2017.
// File: toString.h
#include <string>
template<typename T>
const std::string toString(T){return "";}
// File: toString.cpp
#include "toString.h"
template <>
const std::string toString<int>(int value){
return std::to_string(value);
}
// File: main.cpp
#include <iostream>
#include "toString.h"
int main() {
// specialized
std::cout <<"int: "<< toString(1) << std::endl;
// not specialized
std::cout <<"double: "<< toString(1.0) << std::endl;
return 0;
}
// Expected output:
// int: 1
// double:
В компоновщике происходит сбой, поскольку функция создается неявно, а не связана со специализацией int, что приводит к дублированию символов.
Если реализация шаблона по умолчанию удалена, то строка, печатающая double
, потерпит неудачу, так как не будет символа, связывающего его с *. 1007 *
Мой вопрос заключается в том, существует ли какой-либо способ достижения того же результата в Windows с MSVC, если у main.cpp нет какой-либо видимости специализации toString (объявление или определение).
Если нет, охватывается ли это стандартом или просто подробностями реализации компилятора?