2009-03-26 16 views
15

Gần đây, tôi đã gặp sự cố này. Tôi đã tìm thấy nhiều trường hợp người đặt câu hỏi — here, for example — nhưng không có câu trả lời cụ thể.Có nghĩa là gì khi bạn nhận được lỗi biên dịch "trông giống như định nghĩa hàm" cho khai báo lớp?

Dưới đây là đoạn code mẫu kéo lên từ liên kết đó:

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

Các lỗi này tạo ra là:

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

Trả lời

38

Bạn gần như chắc chắn đã bỏ lỡ tiêu đề xác định AFX_BASE_APPLICATION_APP_CLASS. Trong trường hợp đó, nó sẽ được chuyển qua không thay đổi và VC++ giả định rằng CFileExtension là một hàm trả về class AFX_BASE_APPLICATION_APP_CLASS.

Và, vì nó cho rằng đó là một chức năng, nó cũng nghĩ rằng nó cần dấu ngoặc đơn.

Bạn chỉ cần tìm nơi AFX_BASE_APPLICATION_APP_CLASS được xác định và #include tệp đó.

+1

Có cùng một vấn đề, đã khắc phục sự cố . –

4

... và câu trả lời, vì tôi không thể bị làm phiền đến hãy đăng nhập cho bất kỳ diễn đàn nào trong số này, nhưng tôi đã có OpenID :-)

Trong trường hợp của tôi (và tất cả những gì tôi tìm thấy), vấn đề là tôi thiếu một số nclude cho tệp tiêu đề chứa định nghĩa cho macro trước tên lớp. Macro có nhiều khả năng được sử dụng như một cách chuyển đổi cấu hình xây dựng để bật __declspec (dllexport).

Cách tôi phát hiện ra điều này là bằng cách vào các thuộc tính của dự án, "C/C++" | Tiền xử lý và bật "Tạo tệp đã xử lý trước". Khi tôi nhìn vào đầu ra được xử lý trước, tôi phát hiện ra rằng macro đã được bao gồm nguyên văn thay vì được mở rộng.

+0

Tim là chính xác, tôi đã chỉ phải đối mặt với lỗi này và tôi đã bỏ lỡ một bộ tiền xử lý xác định rằng có thể đã xác định vĩ mô trước tên lớp. Khi vĩ mô được xác định, lỗi được giải quyết ... Nói thẳng thắn, tôi sẽ chỉ bỏ phiếu cho câu trả lời của Tim, nhưng phát hiện ra điểm số của tôi không đủ cao :-) EB – echobravo

3

chỉ cần xác định AFX_BASE_APPLICATION_APP_CLASS

6

Tôi gặp lỗi trình biên dịch tương tự. Vấn đề là một dấu hai chấm thiếu

Mã của tôi đã được một cái gì đó như:

int MyClass:doSomething() { 

} 

Nó cần phải có được: (Lưu ý '::' thay vì ':'

int MyClass::doSomething() { 

} 
+1

Đây cũng là vấn đề của tôi - trong VS2010 "chế độ hỗn hợp", nơi không có sự hấp dẫn để giúp bạn! – Melanie

0

Một thể nguyên nhân là sử dụng một __declspec (dllimport) thay vì __declspec (dllexport) hoặc không có declspec ở tất cả như tiền tố lớp/hàm trong Visual C++. s lên, lớp học của bạn cũng có thể không được công nhận như vậy và bạn nhận được cùng một lỗi.

0

Tôi gặp vấn đề tương tự và không có giải pháp nào hoạt động. Vấn đề như được đăng trong OP đã đến từ bao gồm cả lớp:

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

Đây là lớp xuất từ ​​dll mà tôi muốn sử dụng trong bảng điều khiển exe. Nếu tôi tạo ứng dụng giao diện điều khiển là 'sử dụng mfc' trong trình hướng dẫn tạo, thì lỗi này không xảy ra nhưng tùy chọn đó dẫn đến việc tạo cấu trúc ứng dụng khác.

Dù sao thì tôi đã cố bao gồm các tiêu đề khác nhau để nó biết AFX_EXT_CLASS, đã xác định nhưng không có gì hoạt động. Dài câu chuyện ngắn, giải pháp là chúng ta phải kích hoạt để sử dụng MFC cho các ứng dụng cho nó để hiểu được xuất khẩu MFC lớp từ dll. Làm sao chúng ta làm điều đó là bằng cách chỉnh sửa tập tin .vcproj và chèn dòng UseOfMFC="2" như hình dưới đây:

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

Cũng #include <afx.h> để stdafx.h (tôi bao gồm nó ở phía trên bên phải trước bao gồm đầu tiên).

Bây giờ relead, clean và xây dựng lỗi sẽ biến mất.

Không có cách nào khác để thay đổi tùy chọn này từ cài đặt dự án. Tùy chọn này khác với Thuộc tính dự án >> Thuộc tính cấu hình >> Chung >> 'Sử dụng MFC'.

Cập nhật

Các UseOfMFC="2" lừa có thể hữu ích ở những nơi khác nhưng dường như nếu bạn chỉ #include <afx.h> VÀ thay đổi cài đặt project properties >> General >> 'Use of MFC' để sử dụng MFC trong dll chia sẻ, so với lỗi này sẽ biến mất. Nếu bạn không thay đổi các thiết lập sau một lỗi biên dịch sẽ xảy ra

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] 

Thay đổi này thực sự cũng không thiết lập UseOfMFC="2" trong hồ sơ dự án, vì vậy đây là một cách đúng đắn.

Các vấn đề liên quan