当前位置: 首页 > 知识库问答 >
问题:

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

洪楚
2023-03-14

我尝试使用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函数指针,它说

”错误的模板参数数(3,应该是4):RWProperty

“提供给”模板

我想我在模板中传递参数是错误的。

有人知道发生了什么吗?

共有1个答案

刘翔宇
2023-03-14

您的代码中有三个错误:

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

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

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

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;
};
 类似资料:
  • 我尝试在具有不可见结构器类(字符串变量0,记录器var1,记录器上下文变量2)的最终类中访问info(字符串变量)方法) 这就是错误

  • 我想将的样条插值包含到一个更大的公式中,并想借助确定这个公式的导数。 我尝试了以下代码: 令人沮丧的是,代码的编译给出了以下错误信息: 我怎样才能避免这个错误?提前感谢您提供的任何有用提示。 本征版本是3.2。1.Eigen版本3.1和3.0的编译也失败。 编译器版本为: gcc 4.8版。1(Ubuntu/Linaro 4.8.1-10ubuntu9)

  • 以下代码使用gcc和MSVC编译,但使用clang失败,我使用clang-3.5和当前主干进行了测试)。 clang实例化了函数体并在上出错。gcc和MSVC只查看函数声明,而忽略正文中的。 如果您删除Constexpr,所有编译器都会很好地编译代码。 问题: 如果声明了返回类型,是否允许decltype查看函数体? 我正在寻找标准中相应章节的参考。

  • 我有以下代码使用可变参数模板来调用std::async, 但我收到以下编译错误消息: 没有用于调用“async(std::launch,bool (TestChild:: 我认为这可能与我传递其他参数以及参数包的事实有关。任何人都知道这有什么问题,我应该做些什么来让它发挥作用?

  • 问题内容: 在我正在开发的PHP Web应用程序中,我看到以两种可能的方式定义的函数。 方法1: 方法二: 什么时候应该使用一种方法来替代另一种方法?看来,如果系统要求不断变化,因此myfunc的参数数量不断变化,则方法1可能需要大量维护。 问题答案: 如果系统变化频繁,以至于使用索引数组是最好的解决方案,那么我想这就是您的后顾之忧。:-) 通常,函数/方法不应使用太多参数(5个加减2是最大值),

  • 我正在构建一些输入检查器,需要为整数和/或双精度设置特定的函数(例如,“iPrime”应该只适用于整数)。 如果我使用作为参数,它工作得很好: 但如果我将其用作模板参数(如上所示)http://en.cppreference.com/w/cpp/types/enable_if ) 那么我有以下错误: 我不知道第二个版本出了什么问题。