Как сделать указатель на не-функцию-член? - PullRequest
1 голос
/ 19 сентября 2010

если у меня есть, например, класс А, который содержит функции:

//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 (..) внутри функции, я получил эту ошибку: msgstr "неразрешенный тип перегруженной функции". я называю это так:

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

что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 19 сентября 2010

Перегруженные функции обычно разрешаются на основе типов их аргументов. Когда вы делаете указатель на функцию, это невозможно, поэтому вы должны использовать оператор address-of в однозначном контексте.

Применение - это один из способов добиться этого.

static_cast<funcP>(&operator+)
0 голосов
/ 19 сентября 2010

"который является глобальным (для моего понимания)."

не для Microsoft c по крайней мере «Функция друга, определенная в классе, не должна обрабатываться так, как если бы она была определена и объявлена ​​в глобальной области пространства имен» из ms Visual C ++ help

0 голосов
/ 19 сентября 2010

Не делай этого.Это уродливо, подвержено ошибкам, и его трудно понять и поддерживать.

Это то, для чего были изобретены шаблоны:

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

(Обратите внимание, что я удалил const из типа возвращаемого значения функции.нет смысла.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...