在此代码中,我想将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>();
,那么它可以正常工作。我通过查看错误消息尝试了几种方法,但无法正确获取语法。我也在这里搜索过,发现了一些处理模板类的有用帖子,但没有处理模板函数。我尝试使用这些答案,但没有帮助。
请您帮我解释一下这个语法,或者向我解释下一步我应该尝试做些什么呢?
答案 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作为模板参数传递。模板不允许您将值作为参数传递,因为它们需要在编译时解析。