我正在为C ++尝试一个简单的属性系统的实现,我发现here。
但代码无法编译。
template <class T, class Object, typename T (Object::*real_getter)()>
class ReadOnlyProperty
{
Object * my_object;
public:
void operator () ( Object * obj )
{
my_object = obj;
}
T operator()() const
{
return (my_object->real_getter)();
}
T get() const
{
return (my_object->real_getter)();
}
void set( T const & value );
operator T() const {
return (my_object->*real_getter)();
}
typedef T value_type;
};
我在第一行遇到了多个错误。我正在使用Xcode 4,LLVM 2.1或GCC 4.2都无法编译。有什么问题?
答案 0 :(得分:4)
成员函数指针可以是模板参数,但在这种情况下,您不应该在typename
之前放置:
template <class T, class Object, T (Object::*real_getter)()>
另一个错误是电话:
(my_object->real_getter)()
应该是:
(my_object->*real_getter)()
答案 1 :(得分:0)
模板参数列表不起作用。模板参数必须是以下类型之一:类型名称,类型(带限制)或模板。
也许你的意思是有一个默认类型,就像这样?
template <class T,
class Object,
typename U = T (Object::*real_getter)()>
class ...
此处U
默认为指向成员的函数,但您必须提供包含返回类型的完整签名。
或者您的意思是real_getter
成为会员typedef?
template <class T, class Object>
class ReadOnlyProperty
{
typedef typename T (Object::*real_getter)();
//...
};
或者正如@jmihalicza建议的那样,你想要一个T (Object::*)()
类型的值参数?
template <class T, class Object, T (Object::*real_getter)()>
class ReadOnlyProperty
{ //...
};