gpt4 book ai didi

c++ - 将指针传递给函数时隐式类型未知

转载 作者:太空狗 更新时间:2023-10-29 20:47:10 25 4
gpt4 key购买 nike

我正在查看一些已移植但无法编译的代码。代码是以一种相当“C”的方式编写的,并且正在传递函数指针以便在对象上设置特定的修改器。被填充的对象声明如下:

class Person
{
std::string n_;
int a_;

public:
void name( const std::string& n ) { n_ = n; }
std::string name() const { return n_; }
void age( const int& a ) { a_ = a; }
int age() const { return a_; }
};

相当标准的东西。然后我们有一些有趣的函数,为简洁起见,我已经对其进行了修剪:

typedef void (Person::FnSetStr)(const std::string& s);
typedef void (Person::FnSetInt)(const int& i);

void setMem( const std::string& label, Person* person, FnSetStr fn)
{
// Do some stuff to identify a std::string within a message from the label.
// assume that 'val_s' contains the string value of the tag denoted by
// the label.
(person->*fn)(val_s);
}

void setMem( const std::string& label, Person* person, FnSetInt fn)
{
// Do some stuff to identify an int within a message from the label.
// assume that 'val_i' contains the int value of the tag denoted by the
// label.
(person->*fn)(val_i);
}

然后调用如下:

Person* person = new Person;
setMem("Name", person, Person::name ); // (1)
setMem("Age", person, Person::age ); // (2)

这个想法似乎是传递一个标签、一个对象和一个适当的修改器的地址。第三个参数的类型用于让编译器选择要调用的重载,然后特定重载准备好合适的变量并调用将其作为参数传递的函数以设置对象的值。

这适用于旧的 Solaris 编译器。但是,当它在 GCC 上编译时,我在 (1)(2) 点失败:

error: no matching function for call to
'setMem( const std::string& label, Person* person, <unknown type> )'

看起来新编译器将 Person::age 视为类型而不是指向函数的指针,因此无法解析重载。我正在考虑更改代码以使用函数对象而不是直接指向函数的指针。

我想知道是否有一种方法可以让调用代码保持这样(即没有明确说明函数采用的类型),记住我无法更改 Person类,理想情况下希望将更改保持在最低限度。

最佳答案

首先更改声明:

typedef void (Person::*FnSetStr)(const std::string& s);
typedef void (Person::*FnSetInt)(const int& i);

然后更改调用:

setMem("Name", person, &Person::name );   // (1)
setMem("Age", person, &Person::age ); // (2)

在 VS 2010 中以警告级别 4 构建干净。

关于c++ - 将指针传递给函数时隐式类型未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6277649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com