2009-03-26 16 views
15

मुझे हाल ही में इस समस्या का सामना करना पड़ा। मुझे — here, for example — पर सवाल पूछने वाले लोगों के कई उदाहरण मिले लेकिन कोई ठोस जवाब नहीं मिला।कक्षा घोषणा के लिए संकलन त्रुटि "फ़ंक्शन परिभाषा की तरह दिखने पर" इसका क्या अर्थ है?

यहाँ उस लिंक से फहराया नमूना कोड:

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

उत्तर

38

आपने लगभग AFX_BASE_APPLICATION_APP_CLASS को परिभाषित करने वाले शीर्षलेख को निश्चित रूप से याद किया है। उस स्थिति में, इसे अनलर्टर के माध्यम से पारित किया जाएगा और वीसी ++ मान लेंगे कि CFileExtension एक ऐसा फ़ंक्शन था जो class AFX_BASE_APPLICATION_APP_CLASS लौटा था।

और, क्योंकि ऐसा लगता है कि यह एक कार्य है, यह भी सोचता है कि इसे कोष्ठक की आवश्यकता है।

आपको बस यह पता होना चाहिए कि AFX_BASE_APPLICATION_APP_CLASS परिभाषित किया गया है और #include वह फ़ाइल है।

+1

वही समस्या थी, जिसने इसे ठीक किया । –

4

... और जवाब है, के बाद से मैं करने के लिए परेशान नहीं किया जा सकता है इनमें से किसी भी मंच के लिए लॉगिन करें, लेकिन मेरे पास पहले से ही एक ओपनआईडी था :-)

मेरे मामले में (और संभवतः मुझे मिले सभी), समस्या यह थी कि मुझे #i याद आ रही थी हेडर फ़ाइल के लिए बहिष्कृत करें जिसमें वर्ग नाम से पहले मैक्रो की परिभाषा शामिल है। __declspec (dllexport) को चालू करने के लिए मैक्रो का निर्माण संभवतः बिल्ड-कॉन्फ़िगरेशन स्विच किए गए तरीके के रूप में किया जाता है।

जिस तरह से मैंने यह खोजा प्रोजेक्ट गुणों में जाकर, "सी/सी ++" | प्रीप्रोसेसर और "प्रीप्रोसेस्ड फाइल जेनरेट करें" चालू करना। जब मैंने प्रीप्रोसेस्ड आउटपुट को देखा, तो मैंने पाया कि मैक्रो को विस्तारित करने के बजाय वर्बैटिम शामिल किया गया था।

+0

टिम सही है, मुझे बस इस त्रुटि का सामना करना पड़ा था और मुझे एक प्रीप्रोसेसर परिभाषित किया गया था जो क्लास नाम से पहले मैक्रो को परिभाषित करता। एक बार मैक्रो परिभाषित हो जाने पर त्रुटि हल हो जाती है ... फ्रैंक होने के लिए, मैं बस टिम के जवाब को वोट देने जा रहा था, लेकिन पता चला कि मेरा प्रतिनिधि स्कोर पर्याप्त नहीं था :-) ईबी – echobravo

6

मैं एक ही संकलक त्रुटि आई परिभाषित करते हैं।

int MyClass:doSomething() { 

} 

यह किया जाना चाहिए था: (ध्यान दें '::' के बजाय ':'

int MyClass::doSomething() { 

} 
+1

यह मेरी समस्या भी थी - वीएस -2010 "मिश्रित मोड" में, जहां आपकी मदद करने के लिए कोई इंटेलिजेंस नहीं है! – Melanie

0

एक अन्य संभावित समस्या एक लापता बृहदान्त्र

मेरे कोड किया गया था कुछ की तरह था कारण __declspec (dlimport) के बजाय __declspec (dllimport) का उपयोग कर रहा है या Visual C++ में किसी वर्ग/फ़ंक्शन उपसर्ग के रूप में कोई declspec नहीं है।

यदि आप थाई मिश्रण करते हैं एस, आपकी कक्षा भी इस तरह पहचानने में असफल हो सकती है और आपको एक ही त्रुटि मिलती है।

0

मुझे एक ही समस्या थी और समाधानों में से कोई भी काम नहीं करता था। समस्या ओपी में तैनात के रूप में वर्ग सहित से आ रहा था:

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

यह एक dll जो मैं एक सांत्वना exe में उपयोग करना चाहते से एक निर्यात वर्ग था। यदि मैं कंसोल एप्लिकेशन को बनाम विज़ार्ड में 'mfc का उपयोग करके' बना देता हूं, तो यह त्रुटि नहीं हो रही थी, लेकिन उस विकल्प के परिणामस्वरूप ऐप की एक अलग संरचना बन गई।

वैसे भी मैंने विभिन्न शीर्षलेखों को शामिल करने का प्रयास किया ताकि यह AFX_EXT_CLASS को परिभाषित किया गया हो, लेकिन इसे कुछ भी नहीं किया गया। लंबी कहानी छोटी है, समाधान यह है कि हमें डीएफसी से एमएफसी निर्यातित वर्ग को समझने के लिए आवेदन के लिए एमएफसी का उपयोग करने में सक्षम होना है। हम संपादन .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 को (मैं इसे ऊपरी दाएँ भाग में शामिल करने से पहले शामिल हैं)।

अब रिलीज, साफ और त्रुटि का निर्माण दूर जाना चाहिए।

परियोजना सेटिंग्स से इस विकल्प को बदलने का कोई और तरीका नहीं था। यह विकल्प से अलग है परियोजना गुण >> कॉन्फ़िगरेशन गुण >> सामान्य >> 'एमएफसी का उपयोग'

अद्यतन

UseOfMFC="2" चाल शायद उपयोगी कहीं लेकिन जाहिरा तौर पर अगर आप सिर्फ #include <afx.h> और साझा dll में MFC का उपयोग करने के लिए, की तुलना में इस त्रुटि दूर चला जाता है सेटिंग्स project properties >> General >> 'Use of MFC' बदल जाते हैं। आप बाद में सेटिंग में बदलाव नहीं करते हैं तो एक संकलक त्रुटि

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" सेट करता है, तो यह सही तरीका है।

संबंधित मुद्दे