2012-07-06 16 views
8

stdコンストラクタの呼び出しはstd::で修飾される必要がありますか?stdコンストラクタの呼び出しを修飾する必要がありますか?

class whatever : public std::runtime_error 
{ 
public: 
    explicit whatever(const std::string& what) : runtime_error(what) {} 
};           //^do I need std:: here? 

それは資格なしで私のコンパイラで動作しますが、私はその振る舞いが標準であるかどうかはわかりません。

+1

基本的に、資格を持たない(必ずしも 'std'ではない)基底クラスを参照できるかどうかを尋ねていますか? –

答えて

7

いいえ。初期化子リストの名前は、whateverクラスのスコープ内で検索されます。このクラススコープには、基本クラスで宣言された名前が含まれ、基本クラスの名前(runtime_error)はstd::runtime_errorのスコープに挿入されます(これはすべてのクラスで標準的な動作です)。

実際のクラス名で使用する名前がtypedefの場合、これは機能しません。例えば、std::istreamや友達など、簡単に誘惑できます。 See here.

+1

"*注入クラス名*"の定義については、C++ 2003、§9.2を参照してください。 –

+0

@Robᵩ:ありがとう、私は手を差し伸べる基準はない。 :o –

1

初期化子リストの資格は必要ありません(資格が許可されているかどうかはわかりません)。これはベースであり、クラスを介して検索されます。

関連する問題