Неизвестное имя типа «класс»;Вы имели в виду «класс»? - PullRequest
50 голосов
/ 21 декабря 2011

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

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

Ответы [ 12 ]

50 голосов
/ 09 марта 2012

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

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

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

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

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

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

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

22 голосов
/ 03 марта 2012

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

enter image description here

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

Import "ClassB.h"

В ClassB.h:

Import "ClassA.h"

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

In ClassA.h:

Import "ClassB.h"

In 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;

In ClassB.m:

Import "ClassA.h"

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

9 голосов
/ 14 февраля 2012

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

4 голосов
/ 27 сентября 2013

ВАЖНО: выберите переменную «Compile Source As» в настройках компилятора и установите для нее значение «Objective-C ++».

2 голосов
/ 29 апреля 2012

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

1 голос
/ 07 марта 2013

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

0 голосов
/ 27 июня 2014

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

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

Файл: B.h

#import "A.h"

Файл: A.h

#import "C.h"

Файл: C.h

#import "B.h"

Это вводит круговую зависимость.

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

@class B;
0 голосов
/ 29 апреля 2014

Исходя из собственного опыта, следует позаботиться о следующих вещах.

  1. Выберите переменную «Compile Source As» в настройках компилятора и установите для нее значение «Objective-C ++», то есть настройки сборки-> Apple LLVM 5.1 - Язык-> Компилировать исходный код As-> Objective-C ++ (в Xcode 5.1.1)

  2. Изменить соответствующие файлы, содержащие заголовочный файл C ++, с .m на.mm (иногда вам нужно изменить все .m на .mm).На этот вопрос ответил @Diziet выше.

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

0 голосов
/ 29 августа 2013

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

Под Apple LLVM Compiler 4.2 - Язык

Диалект языка C ++ (у меня работает Gnu ++ 11) Стандартная библиотека C ++ (Libc ++ работает для меня)

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

0 голосов
/ 13 декабря 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...