C ++模板错误

时间:2011-09-05 22:27:46

标签: c++ templates

我正在为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都无法编译。有什么问题?

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
{ //...
};