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