Итак, у меня есть класс шаблона, который должен вызвать функцию обратного вызова в какое-то время. Эта функция обратного вызова принимает в качестве аргумента шаблон const T
.C++ - Передача указателя функции, принимающего аргумент const в класс шаблона, неверно интерпретируется
Я передаю указатель этой функции классу шаблона Boom<void*>
. Однако аргумент const T
этого обратного вызова интерпретируется как T
.
Но это касается только void*
.
Код:
//main.cpp
void kolbek(const void* val)
{
if(val)
printf("Value is: %d\n", *((int*)val));
else
printf("Value ptr = NULL\n");
}
int main()
{
Boom<void*> bomba;
bomba.setCallback(kolbek); //error!
int* nuint = new int(5);
bomba.callCallback((void*)nuint);
delete nuint;
return 0;
}
//boom.h
template<typename T>
class Boom
{
private:
void (*someCallback)(const T) = nullptr;
public:
Boom(){ }
~Boom(){ }
void setCallback(void (*callbk)(const T));
void callCallback(const T val);
};
//boom.cpp
template<typename T>
void Boom<T>::setCallback(void (*callbk)(const T))
{
this->someCallback = callbk;
}
template<typename T>
void Boom<T>::callCallback(const T val)
{
if(someCallback)
(*someCallback)(val);
else
printf("Bad! Callback's NULL!\n");
}
template class Boom<int>;
template class Boom<void*>;
И при попытке скомпилировать это, выдается ошибка:
error: invalid conversion from 'void (*)(const void*)' to 'void (*)(void*)' [-fpermissive]
error: initializing argument 1 of 'void Boom<T>::setCallback(void (*)(T)) [with T = void*]' [-fpermissive]
Как это исправить? Похоже, что только указатели void * неверно интерпретируются.
Прежде всего вы не можете создать реализацию своих шаблонов внутри файла cpp, так как они не будут связаны ... переместите ваш boom.cpp-контент в ваш файл boom.h –
@WojciechFrohmberg - это неправда. Он явно создает экземпляры двух типов - Boom и Boom . Если они являются типами, которые ему нужны в другом месте, тогда они свяжутся только с прекрасным –
Smeeheey
, во-вторых, ваш компилятор видит ваш шаблонный параметр метода callbk как 'void * const', а не' const void * ' –