c++ - 错误的模板参数数量(3,应该是 4)

标签 c++ templates properties arguments getter-setter

我尝试在 C++ 上使用属性来使用它,而不是在数据类中有太多的 setter 和 getter 函数有很多成员变量。

有两个属性类。第一个默认有固定的 setter 和 getter 函数 set, get。第二个支持使用其类的自定义 setter 和 getter 函数。下面是代码

template <class T>
class Property
{
    T data;
public:
    // access with function call syntax
    Property() : data() { }
    T operator()() const
    {
        return data;
    }
    T operator()( T const & value)
    {
        data = value;
        return data;
    }
    // access with get()/set() syntax
    T get() const
    {
        return data;
    }
    T set( T const & value )
    {
        data = value;
        return data;
    }

    // access with '=' sign
    operator T() const
    {
        return data;
    }
    T operator = ( T const & value )
    {
        data = value;
        return data;
    }

    typedef T value_type; // might be useful for template deductions
};



// a read-write property which invokes user-defined functions
template <class T, class Object, T(Object::*real_getter)(), T(Object::*real_setter)(T const &) >
class RWProperty
{
    Object * my_object;
public:
    // this function must be called by the containing class, normally in a
    // constructor, to initialize the RWProperty so it knows where its
    // real implementation code can be found
    void operator () ( Object * obj )
    {
        my_object = obj;
    }

    // function call syntax
    T operator()() const
    {
        return (my_object->*real_getter)();
    }
    T operator()( T const & value )
    {
        return (my_object->*real_setter)( value );
    }

    // get/set syntax
    T get() const
    {
        return (my_object->*real_getter)();
    }
    T set( T const & value )
    {
        return (my_object->*real_setter)( value );
    }

    // access with '=' sign
    operator T() const
    {
        return (my_object->*real_getter)();
    }
    T operator = ( T const & value )
    {
        return (my_object->*real_setter)( value );
    }

    typedef T value_type; // might be useful for template deductions
};

在将其放入项目代码之前,我正在 OptionSet 类中测试这些属性

#include <QString>

class OptionSet
{
public:
    explicit OptionSet() {}

    Property<QString> m_MeshMode;

    RWProperty<uint, OptionSet, &getNumberOfVbo, &setNumberOfVbo> uNumberOfVbo; 
    // this causes problems

protected:

private:
    Property<uint> m_uNumberOfVbo;

    uint setNumberOfVbo(const uint& rVboCount)
    {
        // something to do here
        return m_uNumberOfVbo(rVboCount);
    }
    uint getNumberOfVbo() const
    {
        return m_uNumberOfVbo();
    }

};

但在使用 RWProperty 时,即使我传递了 4 个模板参数,如成员类型,类类型也有 setter 和 getter 函数,getter 函数指针,setter 函数指针,它说

"wrong number of template arguments (3, should be 4) : RWProperty <uint, OptionSet, &getNumberOfVbo, &setNumberOfVbo> uNumberOfVbo"

"provided for 'template<class T, class Object, T(Object::*real_getter)(), T(Object::*real_setter)(const T&)> class RWProperty : class RWProperty"

我想我在模板中传递参数时做错了什么。

有没有人知道发生了什么事?

最佳答案

您的代码中存在三个错误:

首先,要获取成员函数的地址,需要包含类名:

RWProperty<uint, OptionSet
         , &OptionSet::getNumberOfVbo
//         ~~~~~~~~~~~^
         , &OptionSet::setNumberOfVbo> uNumberOfVbo;
//         ~~~~~~~~~~~^               

其次,要形成指向const 限定成员函数的指针,您需要将const 关键字附加到该指针的声明中:

T (Object::*real_getter)() const
//                         ~~~~^ to match 'uint getNumberOfVbo() const'

最后,OptionSet 内部的 OptionSet 本身是一个不完整 类型。除非该成员的声明点在前,否则您不能引用其成员。这基本上意味着您需要在 OptionSet 中重新排序您的声明,以便 setNumberOfVbogetNumberOfVbo 在您声明 之前出现>uNumberOfVbo 数据成员:

class OptionSet
{
    //...

    uint setNumberOfVbo(const uint& rVboCount) { /*...*/ }
    uint getNumberOfVbo() const { /*...*/ }
    // Ok, now they are known and can be found in the class scope

    //...

    RWProperty<uint, OptionSet
            , &OptionSet::getNumberOfVbo
            , &OptionSet::setNumberOfVbo> uNumberOfVbo;
};

关于c++ - 错误的模板参数数量(3,应该是 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30207866/

相关文章:

C++ - 开发自己的 std::count_if 版本

c++ - 模板调用有什么区别?

c++ - 无法动态转换为 ptr

javascript - 使用字符串获取本地对象的属性

java - 使用 Spring Boot 配置和加载多个属性

java - 在 Java 中访问基本包中的资源?

c++ - log2 计算在 cpp 中给出错误结果

c++ - 如何使用 C++ 写入文件的特定列?

c++ - 使用模板更改类型的解决方法

c++ - Boost Fusion 文章、示例、教程?