c++模板错误

C++ template errors

本文关键字:错误 c++      更新时间:2023-10-16

我正在尝试一个简单的c++属性系统的实现,我在这里找到了。

但是代码无法编译。

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都不能编译这个。有什么问题吗?

成员函数指针可以是模板参数,但在这种情况下,不应该将typename放在:

template <class T, class Object, T (Object::*real_getter)()>
另一个错误是调用:
(my_object->real_getter)()

应该是:

(my_object->*real_getter)()

模板参数列表不是这样工作的。模板参数必须是:类型名、类型(有限制)或模板之一。

也许你的意思是有一个默认类型,像这样?

template <class T,
          class Object,
          typename U = T (Object::*real_getter)()>
class ...

这里U默认为指向成员函数的指针,但是您必须提供完整的签名,包括返回类型。

或者你的意思是real_getter是一个成员类型定义?

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