2015-04-26 4 views
8

साथ यह एक कथात्मक क्षेत्र में एक ही नाम के साथ एक नाम स्थान और एक वर्ग डाल करने के लिए अनुमति नहीं है, यानि किअस्पष्ट नाम देखने का उपयोग कर-निर्देश

namespace A {} 
class A{}; 

is ill-formed (देखना §3.3.1/4)। हालांकि, कोई भी उपयोग-निर्देश के माध्यम से किसी एक का नाम पेश कर सकता है:

namespace N { namespace A {int i;} } 

struct A {static int i;}; 

using namespace N; 

int i = A::i; // The global struct, or namespace N::A? 

क्या यह कोड खराब है? कुलपति ++ thinks so, साथ ही Clang:

main.cpp:7:9: error: reference to 'A' is ambiguous 
int i = A::i; 
     ^
main.cpp:3:8: note: candidate found by name lookup is 'A' 
struct A {static int i;}; 
    ^
main.cpp:1:25: note: candidate found by name lookup is 'N::A' 
namespace N { namespace A {int i;} } 
         ^

हालांकि, GCC accepts it

कौन सही है?

+0

जीसीसी चुनता है 'एन :: ए :: i'। सोचता हूँ क्यों। – Barry

+0

@ बैरी मैं बस उलझन में हूं, क्योंकि मुझे उम्मीद है कि यह घोषणा अधिक पसंद करेगी जो अधिक सतही है, यानी लुकअप के बिंदु पर "करीब"। – Columbo

उत्तर

6

कोड खराब है। जब A को देख, §7.3.4/6 चरणों में: नाम देखने दो अलग नामस्थान में एक नाम के लिए एक घोषणा पाता है, और घोषणाओं एक ही इकाई घोषित नहीं करते हैं और कार्यों घोषित नहीं करते

हैं , नाम का उपयोग खराब गठित है।

यहाँ, नामस्थान ग्लोबल नेम स्पेस और N हैं, और संस्थाओं नाम स्थान N::A और वर्ग ::A हैं।

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