2013-02-28 2 views
0

я щипая немного GDAL кода, и я использую ЬурейеЕ как этотTypedef и объявление функции не работают вместе

typedef CPLErr (*MYWriter)(double dfLevel, int nPoints, double *padfX, double *padfY, void *); 

который используется в классе, как этот

class GDALGenerator 
{ 
...blah... 
public: 
    MYWriter pfnWriter; 
    GDALGenerator(int nWidth, int nHeight, MYWriter pfnWriter, void *pWriterCBData); 
...blah... 
}; 

но в том же файле, ниже класса GDALGenerator, когда я создаю функцию, как так

CPLErr MYWriter(double dfLevel, int nPoints, double *padfX, double *padfY, void *pInfo) 
{} 

я получаю эту ошибку

Ошибка 2 ошибка C2365: 'MYWriter': redefinition; предыдущее определение было «ЬурейеЕ» F: \ Проекты \ \ карта somecpp \ somecpp.cpp 1330 MyProjectName

Я запутался, потому что стандартная функция GDAL используется так же, как это, и он работает отлично (класс находится в отдельной DLL в этом случае). Я только что сделал копию функции с другим именем, и она не работает.

+0

И 'typedef' и функции имеют такое же имя. Вы должны переименовать один или другой. Я также рекомендую вам посмотреть на ['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function), который может использоваться для всех видов функций, а не только для автономных или статические функции-члены. –

ответ

3

Вы не можете использовать имя типа как имя функции, только как тип переменной.

Я надеюсь, что это проясняет:

CPLErr f(double dfLevel, int nPoints, double *padfX, double *padfY, void *pInfo) 
{} 
MYWriter foo = f; 

``

+0

Спасибо. Думаю, мне пришлось бы изменить имя и в классе. – Nav

+0

@nav, nope, ваша переменная-член имеет тип указателя на функцию (ваш typedef) и имя «pfnWriter», это совершенно нормально. Вы можете написать 'GDALGenerator g (...); g.pfnWriter = f; 'после строк в моем ответе. – hannes

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