2010-10-06 7 views
10

अगर मैं अपने स्त्रोत फाइल में #include <vector.h> डाल का कारण बनता है, मैं इस चेतावनी मिलती है:"vector.h" या "वेक्टर" भी शामिल है चेतावनियां या त्रुटियां

make -f Makefile CFG=Debug 
g++ -c -g -o "Debug/mynn.o" "mynn.cpp" 
In file included from C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/backward/vector.h:59, 
       from mynn.h:7, 
       from mynn.cpp:1: 
**C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.** 
g++ -g -o "Debug/mynn.exe" Debug/mynn.o 

और अगर मैं सिर्फ #include <vector> (ज बिना नियमित जोड़ने के लिए, चेतावनी की तरह चलता है), मैं निम्नलिखित त्रुटियाँ मिलती है:

make -f Makefile CFG=Debug 
g++ -c -g -o "Debug/mynn.o" "mynn.cpp" 
In file included from mynn.cpp:1: 
**mynn.h:12: error: ISO C++ forbids declaration of `vector' with no type 
mynn.h:12: error: expected `;' before '<' token 
mynn.h:13: error: `vector' has not been declared 
mynn.h:13: error: expected `,' or `...' before '<' token 
mynn.h:13: error: ISO C++ forbids declaration of `parameter' with no type 
mynn.h:20: error: ISO C++ forbids declaration of `vector' with no type 
mynn.h:20: error: expected `;' before '<' token 
mynn.h:21: error: ISO C++ forbids declaration of `vector' with no type 
mynn.h:21: error: expected `;' before '<' token** 

वहाँ एक बेहतर तरीका है इस सदिश हेडर को शामिल करने के लिए इतना है कि यह शिकायत नहीं करता है? यहाँ स्रोत फ़ाइल है कि चेतावनी/त्रुटियाँ पैदा करता है:

// mynn.h 
#ifndef _MYNN_H_ 
#define _MYNN_H_ 

#include <stdio.h> 
#include <iostream> 
#include <math.h> 
#include <vector> 

class neuron { 
public: 
    neuron(); 
    vector<int> weights; 
    int compute_sum (vector <int> &input); 
}; 

class layer 
{ 
public: 
    layer(); 
    vector <neuron> nrns; 
    vector<int> compute_layer (vector <int> &input); 
}; 

#endif /*_MYNN_H_*/ 
+3

यदि आप सी ++ कोड लिख रहे हैं, तो सी स्टाइल हेडर के साथ गड़बड़ न करें। और का उपयोग करें। सी स्टाइल हेडर सी ++ स्टाइल हेडर के रूप में उपयोग किया जा सकता है: । – Donotalo

+6

'_MYNN_H_' एक आरक्षित पहचानकर्ता है, [इसका उपयोग न करें] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier)। – GManNickG

उत्तर

30

समस्या यह है कि std नाम स्थान में vector<T> जीवन और आप किसी भी योग्यता या उचित using बयान के बिना प्रकार का उपयोग करने का प्रयास कर रहे है। सबसे सुरक्षित फिक्स std उपसर्ग के साथ प्रकार के उपयोग को स्पष्ट रूप से अर्हता प्राप्त करना है।

std::vector<neuron> nrns; 

यह भी स्पष्ट रूप से एक using बयान के माध्यम से प्रकार का आयात द्वारा निर्धारित किया जा सकता है।

using std::vector; 

मैं हालांकि इस दृष्टिकोण से बच जाएंगे। हेडर फाइलों के लिए using कथन जोड़ना, जबकि कानूनी, खराब अभ्यास है क्योंकि यह बदल सकता है कि आइटम कैसे संकलित किए जाते हैं। यह फ़ॉर्म std के कंबल आयात से सुरक्षित है लेकिन अभी भी बहुत अच्छा नहीं है।

+1

आपका मतलब है 'नेमस्पेस std; ' –

+9

' नामस्थान का उपयोग करके ... 'पर्याप्त लोगों द्वारा विकल्प पर विचार करने के लिए तैयार किया गया है - केवल' उपयोग 'जो आपको वास्तव में चाहिए। अर्थात। 'std :: वेक्टर का उपयोग कर;'। – delnan

+0

@Fred, doh धन्यवाद – JaredPar

15

vectorstd नामस्थान से संबंधित है। आपको std::vector<int> के रूप में अपना नाम पूरी तरह अर्हता प्राप्त करने की आवश्यकता है।

मुझे यह स्पष्ट करने की आवश्यकता है कि सी ++ मानक आपको जेरेडपार के सभी विकल्पों का उपयोग करने की अनुमति देता है, लेकिन मैं दृढ़ता से अनुशंसा करता हूं कि using namespace std और विशेष रूप से हेडर फ़ाइलों में उपयोग न करें। using namespace std के बारे में आप this प्रश्न में अच्छी तरह से वर्णित राय पा सकते हैं। व्यक्तिगत रूप से मैं इसके साथ सहमत हूं, इसलिए मुझे इसे अपने उत्तर में जोड़ने की अनुमति दें।

2

वास्तव में, आपको std :: वेक्टर निर्दिष्ट करने की आवश्यकता है क्योंकि वेक्टर वैश्विक नहीं है। लेकिन मैं सलाह देता हूं कि आप using कीवर्ड का उपयोग न करें।

समस्या का उपयोग करने का दायरा है, और संघर्ष जो बाद में उठा सकते हैं। अधिक यदि आप पोर्टेबल ऐप्स (कोड), (विशेष रूप से लाइब्रेरी के लिए) रखने की योजना बना रहे हैं तो आपको किसी चीज को छोड़ने से बचना चाहिए क्योंकि आप अपने कोड के भविष्य के उपयोगकर्ताओं के लिए अन्य प्लेटफॉर्म पर साइड इफेक्ट्स के बारे में सुनिश्चित नहीं हो सकते हैं।

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