1

在这段代码中,我想将 的地址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>();,那么它可以工作。我通过查看错误消息尝试了几件事,但无法获得正确的语法。我也在这里搜索过,发现了一些处理模板类的有用帖子,但没有处理模板函数。我尝试使用这些答案,但没有帮助。

您能帮我解决一下这个语法吗,或者向我解释一下接下来我应该尝试做什么来解决这个问题?

4

3 回答 3

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);
}
于 2013-02-04T15:57:55.340 回答
1

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

于 2013-02-04T16:00:26.753 回答
0

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

于 2013-02-04T15:59:45.587 回答