Что значит, когда вы получаете ошибку компиляции "выглядит как определение функции" для объявления класса?
Недавно я столкнулся с этой проблемой. Я нашел много случаев, когда люди задавали вопрос: здесь, например, — но нет конкретных ответов.
Вот пример кода, поднятого по этой ссылке:
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"
в файле проекта, так что это правильный путь.