2010-12-14 18 views
6

içine aşağıdaki kod parçacığı vardır:birkaç ad alanlarında aşırı bir işlevi çağırmak bir ad

void foo(double a) {} 

namespace bar_space 
{ 
    struct Bar {}; 

    void foo(Bar a) {} 
} 

foo (çift) bir kütüphaneden bir genel fonksiyonudur. Kendi adresim Bar_space ile kendi ad alanım var Bar. Bar için foo() 'nın aşırı yüklenmesini uygulamak istiyorum; böylece Bar, yerleşik türlere daha benzer.

namespace bar_space 
{ 
    void baz() 
    { 
    foo(5.0); // error: conversion from ‘double’ to non-scalar type ‘ssc::bar_space::Bar’ requested 
    } 
} 

Bu hem benim Fedora ve Mac üzerinde gcc üzerinde derlenmeyecektir: Ben isim alanı içinden (çift) orijinal foo çağırmak istediğinizde

Sorun görünür. kullanılarak

foo(5.0) 
ad dışından

veya arama

namespace bar_space 
{ 
    ::foo(5.0) 
} 

Tamam çalışır, ancak ben (diğer geliştiricileri de içeride çalışıyoruz için umduğu gibi bu doesnt benim yeni fonksiyon oldukça kadar güzel yapmak bar_space).

Bar_space özgün işlevi gizliyor mu? Açık scoping olmadan bar_space içinden foo (5.0) yapılabilmesi için bir yol var mı (: :)? Herhangi bir yardım takdir edilir.

+1

gibi bir şey kullanabilirsiniz, ancak 'bar_space :: foo kullanarak gibi bir şey kullanabilirsiniz;'? – dreamlax

+0

Bu bar_space dışında foo (Bar) kullanılmasına yardımcı olacak, ancak bar_space içine foo (double) almıyor. –

+0

benzer bir şey mümkündür: http://codepad.org/0IcNXZb6 – DaVinci

cevap

5

C++ 'da, name hiding adlı bir kavram var. Temel olarak, bir işlev veya sınıf adı, yuvalanmış bir kapsamda aynı ada sahip bir işlev/sınıf varsa "gizlenir". Bu, derleyicinin gizli adı "görmesini" engeller. C++ standart

Bölüm 3.3.7 şöyledir:

bir isim, bir iç içe bildirime bölgede, aynı adla açık bir beyanı gizli veya türetilebilir sınıfı (10.2)

Yani, sorunuzun cevabı: sizin örnek void foo(double a); yılında Yani çağırmak için :: kapsam operatörünü kullanmak gerekir gizlivoid bar_space::foo(Bar a); gereğidir dış fonksiyon.

+0

hiçbir bar_space :: foo (çift) – DaVinci

+0

@ DaVinci, sabit. –

+1

Standart konuştu, o zaman. Açıklama için teşekkürler. –

1

Evet, bar_space orijinal fonksiyonunu saklandığını ve genel ad alanında tanımlanır foo (çift) ise hayır, açık kapsam belirleme olmadan bar_space whithin çağrılabilir foo (5.0) yapamaz.

+0

Peki, o zaman :: kullanacağım. Ben bahsetmedim, ama foo() gerçekten math.h işlev ceil() 'dir, bu yüzden global ad alanında tanımlanmıştır. –

+0

@Christian - 'yerine (eğer yine de yapmanız gerekir) eklerseniz, o zaman' stil 'isim alanına 'ceil' eklenir, bu durumda sorununuz gider. –

+0

Sadece yaptım. Sorun gitti. Ve evet, 'u tüm yolla kullanmalıydım ... –

1

Ancak, örnek kodda ben C++ bir acemi olduğumu

namespace bar_space 
{ 
    using ::foo; 
    void baz() 
    { 
     Bar bar; 
     foo(5.0); 
     foo(bar); 
    } 
} 
+0

Bu cevabı yayınlayacağım ve sadece test ettim ve benim için iyi bir şekilde derlendi. (Ayrıca iş toplantılarında da dikkatimi dağıttım vb.). – CashCow