在另一个模板类中使用模板类参数的模板参数的正确语法是什么?

例如:如何访问 Foo 类中 Param 类的 X 和 Y?

程序:

template < template < int, int > class X1>
struct Foo {
int foo() {
printf("ok%d %d\n", X1::X, X1::Y);
return 0;
}};

template < int X, int Y >
class Param {
int x,y;
public:
Param(){x=X; y=Y;}
void printParam(){
cout<<x<<" "<<y<<"\n";
}
};

int main() {
Param<10, 20> p;
p.printParam();
Foo< Param > tt;
tt.foo();
return 0;
}

对于上面的代码,对于 printf 语句编译器提示:
In member function 'int Foo<X1>::foo()':
Line 4: error: 'template<int <anonymous>, int <anonymous> > class X1' used without template parameters
compilation terminated due to -Wfatal-errors.

最佳答案

你不能。模板模板参数意味着您采用模板名称 而不提供模板参数

Foo< Param > tt;

在这里您可以看到没有为 Param 提供值。您将采用模板模板参数,以便 Foo 本身可以使用它喜欢的任何参数实例化 Params

例子:
template < template < int, int > class X1>
struct Foo {

    X1<1, 2> member;

    X1<42, 100> foo();
};

template <int N, int P> struct A {};

template <int X, int Y> struct B {};

Foo<A> a_foo;  //has a member of type A<1, 2>, foo returns A<42, 100>
Foo<B> b_foo; //has a member of type B<1, 2>, foo returns B<42, 100>

但是如果你想让你的 Foo 输出这些整数,它必须采用真正的类型,而不是模板。其次,模板参数的名称( XY )仅在它们在范围内时才有意义。否则,它们是完全任意的标识符。您可以使用简单的元编程检索值:
#include <cstdio>

template <class T>
struct GetArguments;

//partial specialization to retrieve the int parameters of a T<int, int>
template <template <int, int> class T, int A, int B>
struct GetArguments<T<A, B> >
{
   enum {a = A, b = B};
};
//this specialization also illustrates another use of template template parameters:
//it is used to pick out types that are templates with two int arguments

template <class X1>
struct Foo {
  int foo() {
    printf("ok%d %d\n", GetArguments<X1>::a, GetArguments<X1>::b);
    return 0;
  }
};

template < int X, int Y >
class Param {
public:
   void print();
};

//this is to illustrate X and Y are not essential part of the Param template
//in this method definition I have chosen to call them something else
template <int First, int Second>
void Param<First, Second>::print()
{
   printf("Param<%d, %d>\n", First, Second);
}

int main() {

    Foo< Param<10, 20> > tt;
    tt.foo();
    Param<10, 20> p;
    p.print();
    return 0;
}

关于c++ - 在模板类 A 中访问 X 和 Y 就像在 template<template<int X, int Y> class> class A 中一样;,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7745405/

10-10 23:32
查看更多