2016-06-26 21 views
3

次のコードが不正なのはなぜですか?名前空間に定義された関数のオーバーロード

#include <iostream> 
using namespace std; 

namespace what { 
void print(int count) { 
    cout << count << endl; 
} 
} 

void what::print(const string& str) { 
    cout << str << endl; 
} 

int main() { 
    what::print(1); 
    what::print("aa"); 

    return 0; 
} 

打ち鳴らすと-std=c++14でコンパイルするとき、私は取得エラーが

error: out-of-line definition of 'print' does not match any declaration in namespace 'what' 

である私は、問題への修正を知っているが、コンパイラがprint(私は関数を定義しようとしていますことを考えて、なぜ私が疑問に思って)の代わりにそれをオーバーロードします。構文

void what::print(const string& str) 

は基本的に、あなたならば、ここで

print関数を定義し、what名前空間内の

を言っているので、それはあなたのために働いていない理由がある

答えて

5

その名前空間の外で関数を定義したい場合は、事前に名前空間に宣言する必要があります。標準状態の

13.1、「とは、2つの以上の異なる宣言が同じスコープ内で単一の名前に指定されている場合、その名前は が過負荷であると言われます。」関数の

オーバーロードが互いに同じ範囲内になければなりません。言語の仕組みだけです。

+1

"関数のオーバーロードは互いに同じ名前空間にある必要があります。"しかし、 '何が::何をしようとしているのか?私は強調しているのは同じスコープ*で*あるべきだと思います。異なる名前空間から関数をオーバーロードしようとするのは確かに異なるスコープです。 –

+0

@ Mr.Llamaは私の答えを修正しました。 –

+0

@ Mr.Llamaまさに私はこの質問をしました! – Curious

関連する問題