Что значит, когда вы получаете ошибку компиляции "выглядит как определение функции" для объявления класса?

Недавно я столкнулся с этой проблемой. Я нашел много случаев, когда люди задавали вопрос: здесь, например, — но нет конкретных ответов.

Вот пример кода, поднятого по этой ссылке:

class AFX_BASE_APPLICATION_APP_CLASS CFileExtension 
{
public:
   CFileExtension ();           
   virtual ~CFileExtension ();
};

Погрешность:

c:\FileExtension.h(14) : error C2470: 'CFileExtension' : looks like a function definition, but there is no formal parameter list; skipping apparent body

Ответы

Ответ 1

Вы почти наверняка пропустили заголовок, который определяет AFX_BASE_APPLICATION_APP_CLASS. В этом случае он будет передан без изменений и VС++ предположил бы, что CFileExtension была функцией, которая вернула class AFX_BASE_APPLICATION_APP_CLASS.

И, поскольку он считает его функцией, он также считает, что ему нужны скобки.

Вам просто нужно найти, где AFX_BASE_APPLICATION_APP_CLASS определено, и #include этот файл.

Ответ 2

Я столкнулся с той же ошибкой компилятора. Проблема заключалась в отсутствующем двоеточии

Мой код был примерно таким:

int MyClass:doSomething() {

}

Должно быть: (Примечание '::' вместо ':'

int MyClass::doSomething() {

}

Ответ 3

... и ответ, так как я не мог беспокоиться о том, чтобы сделать логин для любого из этих форумов, но у меня уже был OpenID: -)

В моем случае (и, вероятно, все, что я нашел) проблема заключалась в том, что я отсутствовал #include для файла заголовка, содержащего определение макроса, предшествующего имени класса. Макрос, скорее всего, используется в качестве способа конфигурации конфигурации, чтобы включить __declspec (dllexport).

Как я обнаружил это, перейдя в свойства проекта, "C/С++" | Препроцессор и включение "Генерировать предварительно обработанный файл". Когда я посмотрел на предварительно обработанный вывод, я обнаружил, что макрос был включен дословно, а не расширялся.

Ответ 4

просто определите AFX_BASE_APPLICATION_APP_CLASS

Ответ 5

Другой возможной причиной является использование __declspec (dllimport) вместо __declspec (dllexport) или вообще не declspec как префикс класса/функции в Visual С++.

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

Ответ 6

У меня была такая же проблема, и ни одно из решений не работало. Проблема, отправленная в OP, включала в себя класс:

class AFX_EXT_CLASS CMyClass : public CObject
{
public  :
// ....
}

Это был класс экспорта из dll, который я хочу использовать в консоли exe. Если я создаю консольное приложение как "используя mfc" в мастере создания, то это Ошибка не происходит, но этот параметр приводит к созданию другой структуры приложения.

В любом случае я пытался включить различные заголовки, чтобы он знал AFX_EXT_CLASS, определил его, но ничего не получилось. Короче говоря, решение состоит в том, что мы должны разрешить использовать MFC для приложения, чтобы он понял класс экспортированного MFC из dll. Как мы это делаем, редактируя файл .vcproj и вставляя строку UseOfMFC="2", как показано ниже:

<Configurations>
    <Configuration
        Name="Debug|Win32"
        OutputDirectory="$(SolutionDir)$(ConfigurationName)"
        IntermediateDirectory="$(ConfigurationName)"
        ConfigurationType="1"
        UseOfMFC="2" <-------------Insert this line here
        CharacterSet="1"

Также #include <afx.h> в stdafx.h(я включил его в верхнем правом углу перед первым включением).

Теперь отпустите, очистите и создайте ошибку, следует уйти.

Не было другого способа изменить этот параметр из параметров проекта. Этот параметр отличается от Project Properties >> Configuration Properties >> General >> 'Use of MFC'.

Обновление

Тройка UseOfMFC="2" может быть полезна в другом месте, но, видимо, если вы просто #include <afx.h> И измените настройки project properties >> General >> 'Use of MFC' на использование MFC в общей DLL, эта ошибка исчезнет. Если вы не измените более поздние настройки, произойдет ошибка компилятора

c:\program files (x86)\microsoft visual studio 8\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error :  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]

Изменение этого на самом деле также устанавливает UseOfMFC="2" в файле проекта, так что это правильный путь.