在这段代码中,我想将 的地址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 调用更改为print<Foo, 3>();
,那么它可以工作。我通过查看错误消息尝试了几件事,但无法获得正确的语法。我也在这里搜索过,发现了一些处理模板类的有用帖子,但没有处理模板函数。我尝试使用这些答案,但没有帮助。
您能帮我解决一下这个语法吗,或者向我解释一下接下来我应该尝试做什么来解决这个问题?