如何指向非成员函数?

时间:2010-09-19 07:16:28

标签: c++ function-pointers

如果我有例如包含函数的类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+);
}

我做错了什么?

3 个答案:

答案 0 :(得分:2)

重载函数通常根据其参数类型进行解析。当你创建一个指向函数的指针时,这是不可能的,所以你必须在明确的上下文中使用address-of运算符。

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

static_cast<funcP>(&operator+)

答案 1 :(得分:0)

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

这是发明模板的原因:

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

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

答案 2 :(得分:0)

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

至少不是微软c “在一个类中定义的友元函数不应该被视为在全局命名空间范围内定义和声明”来自ms visual c ++ help