Ошибка компиляции MSVC при явном создании экземпляра функции шаблона - PullRequest
0 голосов
/ 05 июля 2019

Я перевел свою проблему на небольшой пример, простите за макрос. Кажется, похожая проблема из этой записи больше не является проблемой в VS и компилируется нормально. Я считаю, что у меня есть более специализированная версия этой проблемы, которая не была исправлена, но хочу убедиться, что я что-то не пропустил. Следующий код компилируется в GCC и выполняется ожидаемым образом, но выдает ошибку C2893 (не удалось специализировать шаблон функции) в VS:

Macros.h:

#define If(x) \
  template<class T,class...Args, typename std::enable_if<std::is_same<T, x>::value>::type* = nullptr>
#define Do void Func(Args... args)

Definition.cpp:

#include <string>
#include <iostream>
#include "Macros.h"
using namespace std;


int answer  = 42;
double pie  = 3.14;
string s    = "Hello World";

// Function Definitions
If(int)    Do { cout << answer << endl; }
If(double) Do { cout << pie << endl; }
If(string) Do { cout << s << endl; }

// Explicit Instantiations
template void Func<int>(int, double, string);
template void Func<double>();
template void Func<string>();

Usage.cpp:

#include <string>
#include <type_traits>
#include "Macros.h"

// Template Function Declaration
If(T) Do;

int main() {
    using namespace std;
    Func<int>(5, 2.0, string("hello"));
    Func<double>();
    Func<string>();
}

Как и в примере из другого поста, он работает правильно, если экземпляры получены из фактического использования в функции. Это легко сделать с этим примером, но не так просто с моим кодом.

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