Проблема C ++ с указателем на функцию в классе шаблона - PullRequest
0 голосов
/ 18 октября 2018

Я написал простой шаблонный класс, который вызывает у меня некоторые проблемы при попытке запустить один из его методов.

Пример (минимально завершенный) ниже показывает мою проблему: я определил шаблонный класс, содержащийуказатель на функцию, который устанавливается в конструкторе.

#include <windows.h>

template <class T1> class T1Class
{
public:
    typedef T1 ( *TCopyNodeData )(const T1& SrcData);

    T1Class ( TCopyNodeData CopyNodeData )
    {
        //.....
    }
};

unsigned int CopyIData ( const unsigned int& IData )
{
    //.....
    return 0;
}

char* CopySData ( const char*& NData )
{
    //.....
    return nullptr;
}

int APIENTRY wWinMain ( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow )
{
    T1Class<unsigned int> MyT1Class1 ( CopyIData ); // ok
    T1Class<char*> MyT1Class2 ( CopySData );    // *****  E0289, C2664

    return 0;
}

//  E0289   no instance of constructor "T1Class<T1>::T1Class [with T1=char *]" matches the argument list
//          argument types are : (char *(const char *&NData))
//  C2664   'T1Class<char *>::T1Class(T1Class<char *> &&)' : cannot convert argument 1 from 'char *(__cdecl *)(const char *&)' to 'char *(__cdecl *)(const T1 &)'

Теперь первый конструктор (unsigned int) компилируется нормально, а второй (char *) - нет.Я не понимаю сообщение об ошибке;если я заменю T1 на char * в этом сообщении, у меня будет два идентичных типа параметров, и ничто не должно быть неправильным.

Или - я что-то упустил?

1 Ответ

0 голосов
/ 18 октября 2018
const unsigned int& IData

здесь IData является константной ссылкой на unsigned_int

const char *& NData

здесь NData является изменяемой ссылкой на указатель на const char.

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

Исправление заключается в перемещении квалификатора const:

char* CopySData (char * const& NData )
...