【问题标题】:how to make pointer to non-member-function?如何使指针指向非成员函数?
【发布时间】:2010-09-19 07:16:27
【问题描述】:

如果我有例如包含函数的 A 类:

//this is in A.h
friend const A operator+ (const A& a,const A& b);
friend const A operator* (const A& a,const A& b);

这是一个全球性的(据我所知)。这个函数在 A.cpp 中实现。

现在,我有 B 类,其中也包含函数和成员:

//this is in B.h
friend const B operator+ (const B& a,const B& b);
friend const B operator* (const B& a,const B& b);
A _a;

我想在 B.h 中创建单个方法,而不是使用两个单独的方法:

static const B Calc(const B&, const B&, funcP);

在 B.cpp 和 funcP 中实现的 typedef 是指向上述函数的指针:

typedef const A (*funcP) ( const A& a, const A& b);

但是当我试图在函数内部调用 Calc(..) 时,我得到了这个错误: “未解决的重载函数类型”。我这样称呼它:

friend const B operator+ (const B& a,const B& b){
    ...
    return B::Calc(a,b, &operator+);
}

我做错了什么?

【问题讨论】:

  • 您的代码没有显示const B&const A& 有任何关系。
  • 请发布完整的代码。鉴于您遇到的问题,如果不查看更多代码,就不可能找出问题所在。

标签: c++ function-pointers


【解决方案1】:

重载函数通常根据其参数的类型进行解析。当您创建指向函数的指针时,这是不可能的,因此您必须在明确的上下文中使用地址运算符。

演员表是实现这一目标的一种方法。

static_cast<funcP>(&operator+)

【讨论】:

  • 我试过了,但它给了我错误:从类型“”到类型“const NewDouble (*)(const NewDouble&, const NewDouble&)”的无效静态转换
  • @or.nomore:我以为你说funcPconst A (*)(const A&amp;, const A&amp;) 的类型定义。 NewDouble 是什么?
  • NewDouble 是我的 A,对不起
  • 但是我想使用A类的operator+
  • 除了A 的朋友之外,您是否在任何地方声明const A operator+(const A &amp;, const A &amp;)
【解决方案2】:

不要那样做。它丑陋,容易出错,并且难以理解和维护。

这就是发明模板的目的:

template< typename T >
static T Calc(const T& lhs, const T&, funcP rhs)
{
  return lhs + rhs;
}

(请注意,我从函数的返回类型中删除了const。非引用类型的顶级const 没有意义。)

【讨论】:

  • sbi: const 在函数返回类型上是完美的发现并且经常被鼓励。只有返回类型是非类对象类型时才没有区别。
  • 但我真的不明白它对我有什么帮助。你的意思是把B类变成模板类?
  • @or.nomore:我没有将B 变成类模板,而是将Calc 变成了函数模板。现在可以使用AB 对其进行实例化,并自动选择operator+ 的正确重载。
  • @sbi: 但是 T 总是 B 类型
  • @Charles Bailey:你能解释一下吗?有什么好处?无论如何,客户总是可以创建非const 副本,不是吗?我能想到的唯一情况是限制匿名对象(例如,如果foo() 不是constCalc(...).foo() 将不起作用,尽管T(Calc(...)).foo() 会很好)。
【解决方案3】:

“这是一个全球性的(据我所知)。”

至少不适用于 microsoft c “在类中定义的友元函数不应被视为在全局命名空间范围内定义和声明”来自 ms visual c++ 帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多