2010-12-14 14 views
6

内部I次のコードスニペットがありますから、いくつかの名前空間にオーバーロードされた関数を呼び出す1つの名前空間

void foo(double a) {} 

namespace bar_space 
{ 
    struct Bar {}; 

    void foo(Bar a) {} 
} 

のfoo(ダブル)ライブラリーからの一般的な機能です。 私は自分の名前空間bar_spaceを自分の構造体Barと一緒に持っています。私はBarのfoo()のオーバーロードを実装したいので、Barを組み込みの型にもっと似ています。私は、名前空間内から元のfoo(double)を呼び出すようにしようとしたとき

トラブルが表示されます。

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

これは私のFedoraとMacの両方でのgccでコンパイルに失敗します。使用

foo(5.0) 
名前空間の外部から

かを呼び出す

namespace bar_space 
{ 
    ::foo(5.0) 
} 

は大丈夫動作しますが、私は(他の開発者でも内部の作業しているために期待していたとして、このdoesntのは、私の新しい機能はそれほど素敵作りますbar_space)。

bar_spaceは元の機能を隠していますか?明示的なスコープ(::)なしでbar_space内からfoo(5.0)を呼び出し可能にする方法はありますか?どんな助けもありがとうございます。

+1

のようなものを使用することができ;'? – dreamlax

+0

これは、bar_spaceの外側でfoo(Bar)を使用するのに役立ちますが、bar_spaceにfoo(double)を入れないようにします。 –

+0

何かが可能です:http://codepad.org/0IcNXZb6 – DaVinci

答えて

5

C++には、name hidingという概念があります。基本的に、ネストされたスコープ内に同じ名前の関数/クラスがある場合、関数またはクラス名は「隠されています」。これにより、コンパイラは隠された名前を「見る」ことができなくなります。 C++標準の

セクション3.3.7読み取り:

名が ネストされた宣言領域で同じ名前の明示 宣言によって隠された、または誘導することができる クラス(10.2)

だから、

、あなたの質問に答える:あなたの例ではvoid foo(double a);void bar_space::foo(Bar a);によって隠さあるので、あなたが呼び出すために::スコープ演算子を使用する必要があります外側の関数

+0

bar_space :: foo(double)はありません – DaVinci

+0

@DaVinci、修正されました。 –

+1

標準が話しました。説明をありがとう。 –

1

はい、bar_spaceは、元の関数を隠していると、グローバル名前空間で定義されているのfoo(ダブル)場合は、no、あなたは明示的なスコープなしbar_space whithinから呼び出し可能なのfoo(5.0)を作成することはできません。

+0

よく、私は::を使用します。私は言及しませんでしたが、foo()は実際にはmath.hのceil()関数なので、グローバル名前空間で定義されています。 –

+0

@Christian - 代わりに ''を(もしあなたがやっていなければならない)含めると、 'ceil'が' std'名前空間に含まれます。この場合、問題はなくなります。 –

+0

私はちょうどしました。問題は消え去った。そして、はい、私はすべての方法を使用していたはずです... –

1

しかし、あなたのサンプルコードで、私はC++で初心者だけど、あなたはbar_space :: FOOを使用して `のようなものを使うことができ

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

私はこの回答を投稿して、それをテストしたところ、私にとってはうまくコンパイルされました。 (私はまた、仕事での会議などに気を取られました)。 – CashCow

関連する問題