2011-01-28 20 views
8

मैं जीसीसी के साथ इस कोड संकलन (4.2.1 एप्पल 5664 का निर्माण)अस्पष्ट परिभाषा

#include <cstddef> 

using std::size_t; 

template <char I> struct index { }; 

struct a 
{ 
    void operator()(size_t const &) { } 
}; 

struct b 
{ 
    template <char I> 
    void operator()(index<I> const &) { } 
}; 

struct c: public a, public b { }; 

int main (int argc, char const *argv[]) 
{ 
    c vc; 
    vc(1); 

    return 0; 
} 

और मुझे निम्न त्रुटि दे:

main.cpp: In function ‘int main(int, const char**)’: 
main.cpp:22: error: request for member ‘operator()’ is ambiguous 
main.cpp:14: error: candidates are: template<char I> void b::operator()(const index<I>&) 
main.cpp:9: error:     void a::operator()(const size_t&) 

मैं डॉन ' यह समझने का कारण क्यों नहीं है कि यह कोड संदिग्ध है; दो तरीकों के अलग-अलग हस्ताक्षर होते हैं।

+0

मुझे आश्चर्य है कि बजना अपने कोड संकलन कर सकते हैं, जबकि जीसीसी की शिकायत:

आप नाम अस्पष्टता दूर करना चाहते हैं आप स्पष्ट रूप से a::operator() कॉल कर सकते हैं। – peoro

उत्तर

6

संशोधित c इस तरह से:

struct c: public a, public b 
{ 
    using a::operator(); 
    using b::operator(); 
}; 

सी ++ (पूर्व C++ 0x के लिए) प्रकार कार्यों इनहेरिट में की अजीब है: यदि आप एक आधार वर्ग 'समारोह का ही नाम के साथ एक समारोह प्रदान गुप्त रखता है बेस क्लास वाले।

ऐसा लगता है कि दो वर्गों से विरासत में भी एक ही समस्या है।

// मानक की तलाश में ...

+0

यही वह मामला है यदि उनके पास एक ही हस्ताक्षर है, जो ये कार्य नहीं करते हैं। –

+0

@Zac Howland: सुनिश्चित नहीं है, आप सही हो सकते हैं, लेकिन जीसीसी इसे अन्यथा संकलित नहीं करेगा। शायद एक जीसीसी बग? Clang किसी भी मुद्दे ओपी के कोड के बिना संकलित होगा ... – peoro

+5

@Zac हाउलैंड: छिपाने के नाम पर हस्ताक्षर हस्ताक्षर नहीं होता है। –

1

इसकी संदिग्ध क्योंकि आप एक पूर्णांक स्थिरता में गुजर रहे हैं जो संभवत: std::size_t या index प्रकारों पर जा सकती है। निम्न के main बदलें और यह इसे हल करना चाहिए:

int main (int argc, char const *argv[]) 
{ 
    c vc; 
    vc(static_cast<std::size_t>(1)); 

    return 0; 
} 
ने कहा कि साथ

बात की काफी संभावना है कि आप एकाधिक वंशानुक्रम यहाँ का उपयोग नहीं किया जाना चाहिए।

+1

एक पूर्णांक को इंडेक्स प्रकार में नहीं डाला जा सकता है। और यदि आप संकलन करने का प्रयास करते हैं, तो यह काम नहीं करता है। –

+0

@ मत्तीया: आपको समस्या के बारे में अधिक विशिष्ट होना होगा। जो आपने दिखाया है, उसके ऊपर उपरोक्त कोड काम करेगा (जाहिर है, अगर आप अन्य ऑपरेटर चाहते हैं तो आपको कास्ट बदलना होगा)। @peoro: 'static_cast' वास्तव में वह क्या कर रहा है - एक विशिष्ट प्रकार के लिए एक पूर्णांक कास्टिंग। –

+0

@ मैटिया: इनलाइन 'static_cast' के बजाय इसे करने का प्रयास करें: 'std :: size_t i = 1; वीसी (i); ' –

6

नाम संकल्प अधिभार संकल्प से पहले किया जाता है।
तो संकलक यह आधार वर्ग में operator() की तलाश में हो जाता है c में कोई operator() नहीं है और b में a और दूसरे में एक ही नाम अस्पष्ट बना पाता है (और कोई अधिभार संकल्प जगह लेता है)। , vc.a::operator()(1);

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