2010-09-19 1 views
1

, если у меня есть, например, класса А, который содержит функции:Как сделать указатель на функцию, не являющуюся членом?

//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; 

вместо того, чтобы использовать два отдельных методов, я хочу, чтобы создать единый метод в Bh:

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

который реализуется в B.cpp и funcP является ЬурейиМ указателем на функцию выше:

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+); 
} 

что я делаю неправильно?

+1

Ваш код Безразлично» t показывают, что 'const B &' никак не связан с 'const A &'. –

+0

Пожалуйста, напишите полный код. Учитывая проблемы, с которыми вы сталкиваетесь, невозможно понять, что не так, не видя больше кода. –

ответ

2

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

Литой способ является одним из способов достижения этого.

static_cast<funcP>(&operator+) 
+0

Я пробовал это, но он дал мне ошибку: недействительный static_cast из типа '<неразрешенный перегруженный тип функции>' для ввода 'const NewDouble (*) (const NewDouble &, const NewDouble &)' –

+1

@ or.nomore: Я думал, вы сказали, что ' funcP' был typedef для 'const A (*) (const A &, const A &)'. Что такое 'NewDouble'? –

+0

NewDouble is my A, извините за смешение –

0

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

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

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

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

+0

sbi: 'const' отлично находит и часто поощряется к типам возвращаемых функций. Это не имеет никакого значения, если тип возвращаемого типа неклассифицирован. –

+0

, но я не понимаю, как это может мне помочь. вы имеете в виду превращение класса B в шаблоны calss? –

+0

@or.nomore: я не превратил 'B' в шаблон класса, а' Calc' - в шаблон функции. Теперь он может быть создан как с помощью «A», так и «B» и автоматически выбирает правильную перегрузку «operator +». – sbi

0

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

не майкрософт с, по крайней мере «Функцию друг определить в классе не должен рассматриваться, как если бы это были определены и объявлены в глобальной области видимости пространства имен» из MS Visual C++ поможет

Смежные вопросы