如何将内部typedef作为模板函数参数传递“int X :: *”?

时间:2013-02-04 15:51:41

标签: c++ templates c++03

在此代码中,我想将x.y的地址作为模板参数typename Name::Type leValue传递。

#include <iostream>
using std::cout;
using std::endl;

struct X {
   X() : y(123) {}
   const int y;
};

template<typename Name, typename Name::Type leValue>
void print() { cout << *leValue << endl; }

struct Foo {
   typedef int X::* Type;
};


int main() {
    X x;
    print<Foo, &x.y>();  // What is the right syntax here?
}

但是,使用gcc 4.7.2,我收到以下错误:

  

source.cpp:在函数'int main()'中:
  source.cpp:22:5:错误:模板参数列表中的解析错误
  source.cpp:22:22:错误:没有匹配函数来调用'print()'   source.cpp:22:22:注意:候选人是:
  source.cpp:11:6:注意:模板void print()
  source.cpp:11:6:注意:模板参数扣除/替换失败:
  source.cpp:22:22:错误:模板参数2无效

如果我改为将typedef更改为typedef int Type;,并将打印调用更改为print<Foo, 3>();,那么它可以正常工作。我通过查看错误消息尝试了几种方法,但无法正确获取语法。我也在这里搜索过,发现了一些处理模板类的有用帖子,但没有处理模板函数。我尝试使用这些答案,但没有帮助。

请您帮我解释一下这个语法,或者向我解释下一步我应该尝试做些什么呢?

3 个答案:

答案 0 :(得分:2)

这接近你想要的吗?

#include <iostream>
using std::cout;
using std::endl;

struct X {
   X() : y(123) {}
   const int y;
};

template<typename Name, typename Type, Type Name::*Member>
void print(Type& obj) { cout << obj.*Member << endl; }

int main() {
    X x;
    print<X, const int, &X::y>(x);
}

答案 1 :(得分:1)

x.y的地址在编译时是未知的。您可以将指向成员y的指针作为模板参数,但是,您必须在运行时传递对象实例的地址。

答案 2 :(得分:0)

当您将其更改为int时,它会起作用,因为您允许将const int作为模板参数传递。模板不允许您将值作为参数传递,因为它们需要在编译时解析。