2016-04-27 9 views
1
#include <typeinfo> 

struct NullType 
{ 
}; 

template < typename T0, typename T1, typename T2 > 
class Test 
{ 
public: 
    typedef int Type; 
}; 

template< typename T0, typename T1 > 
class Test< T0, T1, NullType > 
{ 
public: 
    typedef unsigned char Type; 
}; 

template< typename T0 > 
class Test< T0, NullType, NullType > 
{ 
public: 
    typedef double Type; 
}; 

int main() 
{ 
    typedef Test<int, int>::Type TargetType; 

    printf("%s\n", typeid(TargetType).name()); 

    return 0; 
} 

私はこのC++コードをコンパイルするために、ビジュアルC++ 2015を使用しますが、それはコンパイルエラーを取得:このクラスの部分テンプレートの特殊化コードが機能しないのはなぜですか?

1>testttt.cpp(34): error C2976: 'Test' : too few template arguments 
1>testttt.cpp(13) : see declaration of 'Test' 
1>testttt.cpp(34): error C2955: 'Test' : use of class template requires template argument list 
1>testttt.cpp(13) : see declaration of 'Test' 

私はクラスTestの第二の特殊化を使用Test<int, int>にしたいです。 でも動作しないようです。

どうしたのですか?

//

マーク

これは有効なコードです:C++ 11と可変長テンプレートいるので、あなたが行うことが

#include <typeinfo> 

struct NullType 
{ 
}; 

template < typename T0 = NullType, typename T1 = NullType, typename T2 = NullType> 
class Test 
{ 
public: 
    typedef int Type; 
}; 

template< typename T0, typename T1 > 
class Test< T0, T1, NullType > 
{ 
public: 
    typedef unsigned char Type; 
}; 

template< typename T0 > 
class Test< T0, NullType > 
{ 
public: 
    typedef double Type; 
}; 

int main() 
{ 
    typedef Test<int, int>::Type TargetType; 

    printf("%s\n", typeid(TargetType).name()); 

    return 0; 
} 
+0

私はそれを使用するとき、すべてのテンプレートパラメータを提供する必要があるので、この場合、私はデフォルトクラスのデフォルトパラメータを設定することができます。それはうまくいくでしょう: – Hikari

答えて

2

template <typename ... Ts> struct Test; 

template <typename T0, typename T1, typename T2> 
struct Test<T0, T1, T2> 
{ 
    using Type = int; 
}; 

template <typename T0, typename T1> 
struct Test<T0, T1> 
{ 
    using Type = unsigned char; 
}; 

template <typename T0> 
struct Test<T0> 
{ 
    using Type = double; 
}; 

int main() 
{ 
    using TargetType = Test<int, int>::Type; 
    // Compile time check: 
    static_assert(std::is_same<unsigned char, TargetType>::value, "unexpected type"); 
    // runtime check: 
    std::cout << typeid(TargetType).name() << std::endl; 
} 

Demo

関連する問題