2012-04-19 29 views
5

Bu, beni ve birkaç iş arkadaşını karıştırdı, ancak bunun 5 farklı derleyiciye karşı bir hata olduğunu doğruladık. Hepsi bu küçük kod parçacığının "belirsiz" olduğunu geri döndürüyor.C++ farklı ad alanlarındaki işlevlere belirsiz çağrı

func.cpp:12:3: error: call to 'bar' is ambiguous 
    bar(x); 
    ^~~ 
func.cpp:5:8: note: candidate function 
    void bar(type_t &); 
    ^
func.cpp:8:6: note: candidate function 
void bar(foo::type_t &); 
    ^
1 error generated. 

neden oluyor:

namespace foo { 
    struct type_t { 
    int x; 
    }; 
    void bar(type_t &); 
} 

void bar(foo::type_t &); 

void func(void) { 
    foo::type_t x = { 10 }; 
    bar(x); 
} 

Clang aşağıdaki döndürür? Kodda "kullanma" ifadeleri yoktur. Çözünürlük sırası foo ad alanını içermemeli, o halde neden orada arama yapıyor? Bu neden belirsiz?

+5

[ADL] (http://en.wikipedia.org/wiki/Argument-dependent_name_lookup), aka Koenig araması hakkında bilgi edinin. – ildjarn

+0

gcc: http://ideone.com/G4uHo –

+0

Bu bir derleyici hatası gibi görünmüyor. Benzer hatalar g ++, HP C++ ve Comeau tarafından üretilir. – daxelrod

cevap

8

argument dependent lookup'dur. bar argümanı, foo ad alanındadır, bu nedenle çubuk aynı ad alanında da gözükür ve sonuçta belirsizlik oluşur. Genel ad alanından foo'u aramak isterseniz, ::foo numaralı telefonu arayın.

+0

Yep, "descoping" operatörünü kullanın: ':: bar()' düzeltmek için :) – Gui13

+0

@ Gui13 teşekkürler, bunu ekliyorum – juanchopanza

İlgili konular