#include <iostream>
using namespace std;
template <typename T = int>
struct Foo {
T t;
Foo() { cout << "Foo" << endl; }
};
template <typename T>
struct Baz {
T t;
Baz() { cout << "Baz" << endl; }
};
template <typename T>
struct Bar {
T t;
Bar() { cout << "Bar" << endl; }
};
template <template <typename X> class T>
struct Bar {
T data;
Bar() : data() { cout << "Bar" << endl; }
};
int main()
{
Bar<Foo<>> a;
Bar<Baz<float>> b;
Bar<int> c;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我刚刚开始学习模板。而且我真的对模板模板参数感到困惑。我知道您正在传递一个模板作为参数。在我的 Bar 模板类中,它接收模板模板参数,<typename X>代表什么?是typename X模板参数吗class T?
template <template <typename X> class T>
struct Bar {
T data;
Bar() : data() { cout << "Bar" << endl; }
};
Run Code Online (Sandbox Code Playgroud)
另外,当我在主函数中调用模板模板参数时,我收到错误,指出 Bar 没有默认构造函数。这是为什么?
typename X只是模板模板参数签名的一部分,你也可以直接写template<template<typename> class T>(没有T参数的名称)。
由于T它本身是一个模板,因此您需要先实例化它,然后才能将其用作类。签名告诉您模板需要实例化什么,在本例中,它需要一个类型名称。
template<typename X>
struct GenericThing
{
X data;
};
template<template<typename> class T, typename E>
struct Bar
{
T<E> sub; // instantiate T with E
Bar() : sub() { cout << "Bar" << endl; }
};
int main()
{
Bar<GenericThing, int> intbar;
Bar<GenericThing, float> floatbar;
return 0;
}
Run Code Online (Sandbox Code Playgroud)