如何在自己的struct中使用模板类的结构?

时间:2015-02-07 15:03:47

标签: c++ templates c++11

我是程序A,我使用lib BI提供的模板类 ab_int 中定义的另一个名为 node_type 的结构来声明一个名为 Node 的结构体我正在使用。

计划A:

struct Node {
 int rank;
 ab_int::node_type nt;

 Node() : rank(), nt() {}
 Node( int rank_new, ab_int::node_type nt_new ) : rank( rank_new ), nt( nt_new ) {}
};

这是lib B中包含struct node_type 的模板:

template<class t_bitvector = bit_vector, ...>
class ab_int
{
   ...
   public: 
    struct node_type {
     ...
     // Assignment operator
     node_type& operator=(const node_type&) = default;

     // Move assignment operator
     node_type& operator=(node_type&&) = default;
     ...
    }

    ...
    node_type root() const {
        return node_type(0, m_size, 0, 0);
    }
    ...
}

在lib B中,还有一个我想要使用的函数 root()

在程序A中,我想实例化struct Node 的新实例:

// wt instantiated (works!)
Node node;
node.rank = 1;
node.nt = wt.root();

我收到以下编译错误:

.../main.cpp:23:5: error: expected a class or namespace
ab_int::node_type nt;
^
.../main.cpp:26:44: error: expected a class or namespace
Node( int rank_new, ab_int::node_type nt_new ) : rank( rank_new ), nt( nt_new ) {}

更新1:

ab_int::node_type更改为ab_int<>::node_type后,会弹出一个不同的错误:

.../main.cpp:63:13: error: no viable overloaded '='
node.nt = wt.root();
~~~~~~~ ^ ~~~~~~~~~
.../ab_int.hpp:752:24: note: candidate function not viable: no known conversion from 'z::ab_int<z::rrr_vector<63, z::int_vector<'\x00'>, 32>, z::rank_support_rrr<'\x01', 63, z::int_vector<'\x00'>, 32>, z::select_support_rrr<'\x01', 63, z::int_vector<'\x00'>, 32>, z::select_support_rrr<'\x00', 63, z::int_vector<'\x00'>, 32> >::node_type' to 'const z::ab_int<z::int_vector<'\x01'>, z::rank_support_v<'\x01', '\x01'>, z::select_support_mcl<'\x01', '\x01'>, z::select_support_mcl<'\x00', '\x01'> >::node_type' for 1st argument
        node_type& operator=(const node_type&) = default;
                   ^
.../ab_int.hpp:755:24: note: candidate function not viable: no known conversion from 'z::ab_int<z::rrr_vector<63, z::int_vector<'\x00'>, 32>, z::rank_support_rrr<'\x01', 63, z::int_vector<'\x00'>, 32>, z::select_support_rrr<'\x01', 63, z::int_vector<'\x00'>, 32>, z::select_support_rrr<'\x00', 63, z::int_vector<'\x00'>, 32> >::node_type' to 'z::ab_int<z::int_vector<'\x01'>, z::rank_support_v<'\x01', '\x01'>, z::select_support_mcl<'\x01', '\x01'>, z::select_support_mcl<'\x00', '\x01'> >::node_type' for 1st argument
        node_type& operator=(node_type&&) = default;

更新2:

第二个编译错误与关于对象wt的实例化的一些不一致有关。因为与原始问题无关,我不再进一步讨论。

2 个答案:

答案 0 :(得分:2)

那是因为ab_int不是类型,它是模板

template<class t_bitvector   = bit_vector, ...>
class ab_int { .. };

你使用它就像一个类型:

struct Node {
   int rank;
   ab_int::node_type nt;
// ^^^^^^^^

因此“预期的类或命名空间”出错。你不能在语法上使用这样的模板。正确的语法是提供ab_int模板的特定实例:

ab_int<bit_vector_type, ...>::node_type nt;
ab_int<>::node_type nt; // use defaults

或者,您可以将Node本身设为模板,将这些类型转发到ab_int(具体取决于这适合您的用例):

template <typename t_bitvector = bit_vector, ...>
struct Node {
    typename ab_int<bitvector, ...>::node_type nt;
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
};

因此,我们需要提供额外的typename关键字,因为现在node_type成为依赖类型。

答案 1 :(得分:0)

如果您希望避免手动指定模板参数,我建议您阅读: http://en.cppreference.com/w/cpp/language/template_argument_deduction

使用模板参数推导可以使模板更灵活,更易于维护。模板是关于编写通用代码,因此手动提供模板类型参数限制了。