Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中创建类型列表时出现问题+;98没有宏_C++_Templates_Template Meta Programming_Template Specialization_C++98 - Fatal编程技术网

C++ 在C+;中创建类型列表时出现问题+;98没有宏

C++ 在C+;中创建类型列表时出现问题+;98没有宏,c++,templates,template-meta-programming,template-specialization,c++98,C++,Templates,Template Meta Programming,Template Specialization,C++98,因此,我正在阅读Andrei Alexandrescu关于如何创建类型列表的文章,但本文中的以下代码不使用MSVC/GCC编译: template <class H, class T> struct typelist { typedef H head; typedef T tail; }; class null_typelist {}; template <class T1> struct cons<T1, null_typelist, null

因此,我正在阅读Andrei Alexandrescu关于如何创建类型列表的文章,但本文中的以下代码不使用MSVC/GCC编译:

template <class H, class T>
struct typelist
{
    typedef H head;
    typedef T tail;
};

class null_typelist {};

template <class T1>
struct cons<T1, null_typelist, null_typelist,
    null_typelist>
{
    typedef typelist<T1, null_typelist> type;
};

template <class T1, class T2>
struct cons<T1, T2, null_typelist, null_typelist>
{
    typedef typelist<T1, typelist<T2,
        null_typelist> > type;
};

template <class T1, class T2, class T3>
struct cons<T1, T2, T3, null_typelist>
{
    typedef typelist<T1, typelist<T2, typelist<T3,
        null_typelist> > > type;
};

template <class T1, class T2, class T3, class T4>
struct cons
{
    typedef typelist<T1, typelist<T2, typelist<T3, 
        typelist<T4, null_typelist> > > > type;
};

typedef cons<float, double, long double>::type
    floating_point_types;
模板
结构类型表
{
H型头;
T型尾;
};
类null_typelist{};
模板
结构控制
{
typedef类型列表类型;
};
模板
结构控制
{
typedef类型列表类型;
};
模板
结构控制
{
typedef类型列表类型;
};
模板
结构控制
{
typedef类型列表类型;
};
typedef cons::type
浮点型;
我得到以下错误:

a.cpp:21:8: error: 'cons' is not a class template
 struct cons<T1, null_typelist, null_typelist,
        ^~~~
a.cpp:28:49: error: wrong number of template arguments (4, should be 1)
 struct cons<T1, T2, null_typelist, null_typelist>
                                                 ^
a.cpp:22:18: note: provided for 'template<class T1> struct cons'
     null_typelist>
                  ^
a.cpp:35:38: error: wrong number of template arguments (4, should be 1)
 struct cons<T1, T2, T3, null_typelist>
                                      ^
a.cpp:22:18: note: provided for 'template<class T1> struct cons'
     null_typelist>
                  ^
a.cpp:42:8: error: redeclared with 4 template parameters
 struct cons
        ^~~~
a.cpp:22:18: note: previous declaration 'template<class T1> struct cons' used 1
template parameter
     null_typelist>
                  ^
a.cpp:48:40: error: wrong number of template arguments (3, should be 1)
 typedef cons<float, double, long double>::type
                                        ^
a.cpp:22:18: note: provided for 'template<class T1> struct cons'
     null_typelist>
                  ^
a.cpp:49:5: error: expected initializer before 'floating_point_types'
     floating_point_types;
     ^~~~~~~~~~~~~~~~~~~~
a.cpp:21:8:错误:“cons”不是类模板
结构控制
^
a、 cpp:35:38:错误:模板参数的数量错误(4,应该是1)
结构控制
^
a、 cpp:22:18:注意:为“模板结构”提供
空\类型列表>
^
a、 cpp:42:8:错误:使用4个模板参数重新声明
结构控制
^~~~
a、 cpp:22:18:注意:以前的声明“模板结构cons”使用了1
模板参数
空\类型列表>
^
a、 cpp:48:40:错误:模板参数的数量错误(3,应该是1)
typedef cons::type
^
a、 cpp:22:18:注意:为“模板结构”提供
空\类型列表>
^
a、 cpp:49:5:错误:“浮点类型”之前应为初始值设定项
浮点型;
^~~~~~~~~~~~~~~~~~~~
对于我正在编写的库,我需要在C++98中使用它,任何类似于可变模板或第三方(如
boost::mpl
)的东西都不能使用


那么问题是什么呢?我对模板元编程还不太了解。

我不知道是否可以在msvc中工作(但可以使用我的g++),但是,在您的代码中,您声明了
cons
部分专门化

因此,在第一次部分专门化之前(主题外:我建议对模板参数使用
typename
而不是
class

模板
结构控制
{
typedef类型列表类型;
};
您应该插入泛型声明,我认为它可能类似于

template <typename,
          typename = null_typelist,
          typename = null_typelist,
          typename = null_typelist>
struct cons;
模板
结构缺陷;

不,这根本不起作用。安德烈在没有一个编译器理解代码的时候写了一些材料,因此他无法让人检查。这可能是此类代码的一个示例。
template <typename,
          typename = null_typelist,
          typename = null_typelist,
          typename = null_typelist>
struct cons;