0

私の問題を小さな例に要約しました。マクロを許してください。この投稿からの同様の問題は、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>();
}

他の投稿の例と同様に、インスタンス化が関数での実際の使用に由来する場合、正しく機能します。この例では簡単ですが、私のコードではそう簡単ではありません。

4

0 に答える 0