2016-06-21 8 views
7

Visual Studio 2015更新3 C++ 11のサポートが改善されましたが、私は奇妙な問題があり、回避策を探しています。MSVC2015更新3可変テンプレート回避策

テンプレート型引数( "完全に定義された型")のためにMSVCを使用して可変長テンプレートコードをコンパイルすると、すべて正常に機能しますが、テンプレートテンプレート引数( "部分的に定義された型")を使用すると、

#include <iostream> 
using namespace std; 

template <template<typename> class... TS> 
struct PARTIAL { 
    static void test(std::ostream& out) 
    { 
     out << "PARTIAL-PROBLEM" << endl; 
    } 
}; 
template <template<typename> class T> 
struct PARTIAL<T>{ 
    static void test(std::ostream& out) 
    {out << "PARTIAL-OK-END" << endl;} 
}; 
template <template<typename> class T, template<typename> class... TS> 
struct PARTIAL<T, TS...>{ 
    static void test(std::ostream& out) 
    { 
     out << "PARTIAL-OK" << endl; 
     PARTIAL<TS...>::test(out); 
    } 
}; 

template <class... TS> 
struct FULL { 
    static void test(std::ostream& out) 
    { 
     out << "FULL-PROBLEM" << endl; 
    } 
}; 
template <class T> 
struct FULL<T>{ 
    static void test(std::ostream& out) 
    {out << "FULL-OK-END" << endl;} 
}; 
template <class T, class... TS> 
struct FULL<T, TS...>{ 
    static void test(std::ostream& out) 
    { 
     out << "FULL-OK" << endl; 
     FULL<TS...>::test(out); 
    } 
}; 
template <typename T> 
struct B{}; 
int main() 
{ 
    FULL<int, int, int>::test(cout); 
    PARTIAL<B, B, B>::test(cout); 
    return 0; 
} 

GCC5.3(MINGW)の出力:

FULL-OK 
FULL-OK 
FULL-OK-END 
PARTIAL-OK 
PARTIAL-OK 
PARTIAL-OK-END 

MSVCの出力:

FULL-OK 
FULL-OK 
FULL-OK-END 
PARTIAL-OK 
PARTIAL-OK 
PARTIAL-OK 
PARTIAL-PROBLEM 

MSVCは、完全な定義されたタイプとパーシャルのコードの異なる方法を生成します。これの最善の回避策は何でしょうか?それが終了する場合のために選択されていないことを保証します再帰的な場合に別のパラメータを追加する

here is demo that works good on GCC

+2

は私にはバグのように見えます。 – Arunmu

+0

終端の '-OK'を' -OK-TERMINATE'に置き換えて、問題をより明確にします。また、問題のコードを減らしてください。ある意味では、動作するコードは面白くありません。これらは「部分型」ではなく「テンプレートテンプレートパラメータ」であることに注意してください。 – Yakk

+0

更新されました。作業部分を削除したくありません。誰かが両方のユースケースの解決方法を見つけるかもしれない – Evgeniy

答えて

4

template <template<typename> class T, template<typename> class T2, template<typename> class... TS> 
//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
struct PARTIAL<T, T2, TS...>{ 
//    ^^^^ 
    static void test(std::ostream& out) 
    { 
     out << "PARTIAL-OK" << endl; 
     PARTIAL<T2, TS...>::test(out); 
       ^^^^ 
    } 
}; 
+0

はい、これは期待どおりに動作します。ありがとう! – Evgeniy