从类型包中解压缩template-template参数

时间:2017-02-17 17:11:13

标签: c++ c++11 templates template-templates

如何解决using行?

test_temp.cpp:

#include <memory>
template <typename A, typename B, template<typename> class C>
class X {};

template <typename A1, typename B1, template<typename> class C1>
class Type_bundle {
public:
    typedef A1 A;
    typedef B1 B;
    template<typename T> using C = C1<T>;
};

template <typename T_b>
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>;


int main() {
    typedef Type_bundle<int,float,std::allocator> Ttb;
    X_b<Ttb> x;
}

来自clang ++的错误

test_temp.cpp:14:63: error: expected an identifier or template-id after '::'
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>;
                                                         ~~~~~^

为什么这不起作用?

2 个答案:

答案 0 :(得分:3)

当你写:

template <typename T_b>
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>;
//                                              ~~~~~~~~~

这表明后面的内容将是一个类型的名称。但T_b::template C不是一种类型,它是一个模板,所以这个结构不是有效的。如果您继续将参数传递到C,则可以使用该构造,例如typename T_b::template C<D>。在那里,typenametemplate都是必需的。

你想要的只是:

template <typename T_b>
using X_b = X<typename T_b::A, typename T_b::B, T_b::template C>;

typename

答案 1 :(得分:-1)

编译:

#include <memory>
template <typename A, typename B, template<typename> class C>
class X {};

template <typename A1, typename B1, template<typename> class C1>
class Type_bundle {
public:
    typedef A1 A;
    typedef B1 B;
    template<typename T> using C = C1<T>;
};

template <typename T_b>
using X_b = X<typename T_b::A, typename T_b::B, 
              T_b::template C >;
int main() {
    typedef Type_bundle<int,float,std::allocator> Ttb;
    X_b<Ttb> x;
}