私の問題を小さな例に要約しました。マクロを許してください。この投稿からの同様の問題は、VS ではもはや問題ではなく、正常にコンパイルされるようです。この問題のより特殊なバージョンが修正されていないと思いますが、何かが欠けていないことを確認したいと思います。次のコードは GCC でコンパイルされ、正常に実行されますが、VS でエラー C2893 (関数テンプレートの特殊化に失敗しました) が発生します。
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)
定義.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>();
使用法.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>();
}
他の投稿の例と同様に、インスタンス化が関数での実際の使用に由来する場合、正しく機能します。この例では簡単ですが、私のコードではそう簡単ではありません。