模板语法的模板

时间:2016-03-16 15:50:39

标签: c++ templates

我对模板模板感到有些失落。

#include <iostream>

template <class T>
class Foo{
    T foobar;
    T getFooBar();
};

template <class T>
T Foo<T>::getFooBar(){
    return (T) 2.0;
}

template <class T, template<class> class H>
class Bar{
    void barbar();
};

template <class T, template<class> class H>
void Bar<T, H<T> >::barbar(){}

int main(int iargc, char *iargv[]){
    // do stuff;
}

这不编译,我不理解编译器的错误信息

expected a class template, got ‘H<T>’

3 个答案:

答案 0 :(得分:3)

正确的语法是传递H

template <class T, template<class> class H>
void Bar<T, H>::barbar() {}
            ^^

H<T>是一种具体类型,H本身就是您正在寻找的类模板。

答案 1 :(得分:1)

H<T>本身就是一种类型,因此您无需将template<class>加上Bar的模板参数前缀。

这是一个简化的例子:

template<class A>
class T1 {
    A a;    
};

template<class B>
class T2 {
    B a;
};

class T3 {
    T1<T2<int> > example;
};

答案 2 :(得分:1)

如果要定义成员函数barbar(),则应

template <class T, template<class> class H>
void Bar<T, H>::barbar(){
    // use the type H<T> here
};