Я нахожусь на своем пути программирования моего первого внешнего для Max 6, но ошибка, вызываемая мной, удерживает меня. Я проработал неделю в Интернете, чтобы найти решение проблемы, но не повезло. Есть много тем, связанных с
error C2664: cannot convert parameter 1 from 'X' to 'Y'
но ни одно из предложенных решений не было подходящим для моего случая, поскольку оно, по-видимому, является специфичным для конкретного объекта.
Более того, у меня есть основной файл.c для моего внешнего, который использует различные другие.cpp файлы и библиотеки. По этой причине я хочу скомпилировать его как.cpp файл. Насколько мне известно, не должно быть проблем с этим. Однако, когда я пытаюсь скомпилировать его в Visual Studio, я получаю следующую ошибку:
error C2664: 't_object *object_alloc(t_object *,const char *,...)' : cannot convert argument 1 from 'void *' to 't_object *' "
Кто-нибудь столкнулся и сумел решить любую подобную проблему? Неужели у меня пропало нечто более глубокое?
Заранее спасибо!
C++, в отличие от C, не допускает неявное преобразование указателя void в указатель не-void. Кажется, что вы пытаетесь передать указатель void как первый аргумент этой функции, но поскольку он не может быть преобразован в тип параметра, возникает ошибка.
Вы можете решить эту проблему, наведя указатель void прямо на тип целевого указателя.
object_alloc(static_cast<t_object*>(p), ...)
(FYI, преобразование в обратном направлении --- указатель на не-void на указатель void --- является стандартным преобразованием и может выполняться неявно). static_cast
разрешено выполнять обратную последовательность стандартных преобразований).
static_cast
не будет компилироваться как C. И идея файла C, который может быть скомпилирован только как C ++, кажется ... Ну, бессмысленно.
В C есть неявное преобразование из void*
в любой тип указателя данных.
Вместе с декларациями неявных функций C это означает, что в C нехорошо бросать результат, например, malloc
, потому что с отсутствующим заголовком (без объявления malloc
), который будет неявно объявлять malloc
с типом результата int
и, по крайней мере, локальным кодом будет компилироваться без видимой ошибки... :(
В C++ нет неявного преобразования из void*
.
Таким образом, в C++ не только должен, но чаще всего должен приводить результат, например, malloc
.
К счастью, C++ не имеет неявных деклараций функций. :)
Хорошим решением для вашей конкретной проблемы может быть компиляция файла C как C (duh).
Однако имейте в виду, что контроль верхнего уровня комбинированной программы C и C++ должен быть лучше C++. Т.е. компилировать main
как C++. Это потому, что C++ имеет некоторые дополнительные требования к библиотеке времени выполнения, такие как динамическая инициализация вещей.
Вместо файла реализации, который может быть скомпилирован как C или C++, рассмотрим только заголовок (только с чисто декларациями), который может использоваться с обоими языками. Это общий способ сделать что-то. Вы можете использовать условный extern "C"
чтобы сделать декларации работоспособными также в C++.