Подтвердить что ты не робот

Неизвестное имя типа "класс"; вы имели в виду "класс"?

Я пытаюсь реализовать класс AQRecorder.h из примера проекта Apple SpeakHere Apple Xcode, но даже я переименую свой класс реализации в ext. *.mm и поместите строку с #import "AQRecorder.h", все еще получая ошибку "Unknown type name 'class'; did you mean 'Class'?" и многие другие. Который по мне означает, что он не распознается как класс С++.

Любая помощь будет оценена.

4b9b3361

Ответ 1

У меня была эта точная проблема. У меня был контроллер вида с использованием класса AQRecorder от AQRecorder.mm.

Когда я включил AQRecorder.h в свой контроллер, эти ошибки произошли. Мне это показалось, потому что мой прямой контроллер просмотра objective-c (названный как .m файл) включал файлы заголовков С++, которые компилятор выдавал ложные ошибки.

Существует два решения. Самый быстрый - переименовать класс контроллера вида, включая AQRecorder.h, в файл .mm, в моем случае UIRecorderViewController от .m до .mm.

Или, переместите следующее:

#include "CAStreamBasicDescription.h"
#include "CAXException.h"

Из AQRecorder.h в AQRecorder.mm. Это означает, что прямые файлы заголовков стиля С++ больше не будут включены (по ссылке) в ваш простой источник Obj-C.

Надеюсь, что это помогает и имеет смысл.

Ответ 2

В моем случае эта ошибка была вызвана циклическими операциями "Импорт" в двух классах: заголовочный файл для каждого класса включал заголовок другого класса, в результате чего имя Неизвестного типа "ClassA" ; вы имели в виду "ClassB"? Ошибка:

enter image description here

Вот как мои инструкции импорта были настроены, когда я получил эту ошибку. В ClassA.h:

Import "ClassB.h"

В ClassB.h:

Import "ClassA.h"

Чтобы исправить это, я использовал директиву декларации @class forward-declare ClassA в ClassB.h (этот promises предварительный компилятор, который ClassA является допустимым классом и что он будет доступен во время компиляции). Например:

В ClassA.h:

Import "ClassB.h"

В ClassB.h:

@class ClassA;

Это зафиксировало ошибку типа "ClassA" неизвестного типа, но также ввело новую ошибку: ClassB.m: Тип получателя "ClassA" для сообщения экземпляра является объявлением вперед. Например:

enter image description here

Чтобы исправить эту новую ошибку, мне пришлось импортировать ClassA.h в начало файла реализации ClassB (ClassB.m). Обе ошибки теперь разрешены, и я получаю нулевые ошибки и предупреждения.

Например, теперь у меня есть:

В ClassA.h:

Import "ClassB.h"

В ClassB.h:

@class ClassA;

В ClassB.m:

Import "ClassA.h"

Оба сообщения об ошибках теперь разрешены.

Ответ 3

Я встретил с вами ту же ошибку, надеюсь, что мое решение может вам помочь. Компилятор Xcode мог компилировать objective-c и С++ в файл "*.mm", поэтому вы можете изменить все свои имена файлов, которые импортируют "AQRecorder.h" (все прямые и косвенные) файлы с постффиксом ".mm". Но вы не можете этого сделать, вы можете обнаружить, что отношения между SpeakHereController и SpeakHereViewController несколько сложны, я только что узнал, как он это использовал, которые создают объект SpeakHereController в файле nib, поэтому в файле SpeakHereViewController не нужно импортировать "AQRecorder.h". мой английский глуп, я надеюсь, что мой ответ может вам помочь.

Ответ 4

ВАЖНО: выберите параметр "Скомпилировать источник как" в настройках компилятора и установите его значение "Objective-C ++".

Ответ 5

Похоже, что эту проблему невозможно решить. Если в файл *.mm можно смещать #include "myС++. H", тогда он работает. Но если вам нужно использовать его из файла objectiveC.h, он терпит неудачу. Я думаю, это ошибка от яблока. Существует способ указать *.mm вместо *.m но ничего не похоже на *.hh вместо *.h

Ответ 6

Я исправил эту проблему сегодня. Если вы #include или #import файл С++ *.h или смешанный *.h файл С++/OC в YourHeader.h, вы ДОЛЖНЫ иметь свой файл YourHeader.mm. Если нет, то все ваши файлы на С++ и смешанный файл С++/OC будут отображать ошибки компиляции.

Ответ 7

Используя XCode, можно использовать "язык" Objective С++, который позволяет смешивать Objective C и С++.

Ответ 8

Мое решение, возможно, выглядит смехотворным, но в xcode 4.2,

Чтобы добавить коды примеров Apple Audio, я переместил все файлы по отдельности, и он работает как прелесть!

Я имею в виду не перетаскивание всей папки, перетащите один за другим все отдельные файлы в spesific папку.

Ответ 9

Я решил эту проблему следующим образом:

Первоначально файлы были помещены внутри проекта, но не внутри правильной файловой структуры.

ДА, я знаю, что это не фактический structre, поскольку он предназначен только для визуальных проблем, но когда я переместил заголовок и файл CPP в папку PROJ, все работало.

Ответ 10

Эта проблема может быть решена путем изменения следующих настроек сборки:

В Apple LLVM Compiler 4.2 - Язык

Языковой диалект С++ (Gnu ++ 11 работает для меня) Стандартная библиотека С++ (LibС++ работает для меня)

Также необходимо указать файлы .m, как .mm, если вы позволяете Xcode использовать расширение файла, чтобы решить, как скомпилировать каждый файл.

Ответ 11

По собственному опыту, следует следить за тем, чтобы вещи были выполнены.

  • Выберите параметр "Скомпилировать исходный текст как" в настройках компилятора и установите его значение "Objective-C ++", то есть "Настройки сборки" → "Apple LLVM 5.1" - "Язык" → "Компилировать исходный текст как" - < Objective-C ++ (в Xcode 5.1.1)

  • Измените соответствующие файлы, которые содержат заголовочный файл С++ с .m до .mm(иногда вам нужно изменить все .m на .mm). Об этом ответил @Diziet.

  • Если вы столкнулись с несовместимыми ошибками типа, явно введите тип литья требуемого типа. Эти ошибки могут не отображаться, когда это был файл .m.

Ответ 12

Это одна из распространенных ошибок: Круговые зависимости.

Рассмотрим пример:

Файл: B.h

#import "A.h"

Файл: A.h

#import "C.h"

Файл: C.h

#import "B.h"

Это вводит циклическую зависимость.

Просто переопределите в C.h как:

@class B;