2016-08-29 10 views
3

私にエラーメッセージを表示する部分は、演算子にオーバーロードするfriend関数の定義を書き込んだときに、 +。 Statisticianはタイプを指定していないと言っています。しかし、それは友人の機能であり、ヘッダーが含まれている実装ファイルに記述されているので、なぜこれを認識できないのかわかりません。また、私はファイル名の統計学者の間違いを覚えていますが、コードブロック内のファイルの名前を簡単に変更する方法はわかりません。"+"演算子をオーバーロードしようとすると、クラスに名前の型がないというエラーメッセージが表示される

//header file 
#ifndef STATISTICIAN_H 
#define STATISTICIAN_H 
namespace GREGORY_STOCKER_STATICTICIAN{ 



class Statistician{ 

public: 
    Statistician(); 
    void next_number(double); 
    void erase_sequence(); 
    int get_length() const {return length_sequence;} 
    double get_sum() const{return sum;} 
    double get_mean() const; 
    double get_largest() const; 
    double get_smallest() const; 
    double get_last() const; 
    friend Statistician operator + (const Statistician &,const Statistician &); 


private: 
    int length_sequence; 
    double sum; 
    double smallest; 
    double largest; 
    double last; 

}; 

#endif 

} 


//implementation file 
using namespace std; 
#include "Statictician.h" 
#include <iostream> 
#include <cassert> 

namespace GREGORY_STOCKER_STATICTICIAN{ 

    Statistician :: Statistician() 
    { 
     length_sequence = 0; 
     sum = 0; 
     smallest = 0; 
     largest = 0; 
     last = 0; 
    } 

    void Statistician :: next_number(double num) 
    { 

     length_sequence += 1; 
     sum += num; 
     if(length_sequence == 1) 
     { 
      smallest = num; 
      largest = num; 
     } 
     if (num < smallest) 
      smallest = num; 
     if (num > largest) 
      largest = num; 
     last = num; 
    } 

    void Statistician :: erase_sequence() 
    { 
     length_sequence = 0; 
     sum = 0; 
     smallest =0; 
     largest = 0; 
     last = 0; 
    } 

    double Statistician :: get_mean() const 
    { 
     assert(length_sequence > 0); 
      return sum/2; 

    } 

    double Statistician :: get_largest() const 
    { 
     assert(length_sequence > 0); 
     return largest; 
    } 
    double Statistician :: get_smallest() const 
    { 
     assert(length_sequence > 0); 
     return smallest; 
    } 

    double Statistician :: get_last() const 
    { 
     assert(length_sequence > 0); 
     return last; 
    } 

} 



//the part that is tripping the error message  
Statistician operator +(const Statistician &s1,const Statistician &s2) 


{ 
    Statistician s3; 
    s3.sum = (s1.sum + s2.sum); 
    s3.sequence_length = (s1.sequence_length + s2.sequence_length; 
    if(s1. largest > s2.largest) 
     s3.largest = s1.largest; 
    else 
     s3.smallest = s2.smallest; 
     if(s1. smallest < s2.smallest) 
     s3.smallest = s1.smallest; 
    else 
     s3.smallest = s2.smallest; 
    s3.last = s2.last; 

    return s3; 
} 
+0

Code :: Blocksでファイルの名前を変更するには、Project Management(デフォルトのビューでファイル名がすべて入っている左側のペイン)を右クリックし、[ファイル名を変更]を選択します –

答えて

0

の宣言は、クラス内の最小の囲む名前空間で宣言します。だからfriend宣言は実際に宣言し、友人GREGORY_STOCKER_STATICTICIAN::operator +です。それは宣言も友人もいません。::operator +

しかし、あなたのコードは::operator +をネームスペースの外側に実装しようとします。これはまったく異なる関数を作成します。つまり、2つのStatisticiansを一緒に追加しようとするコードでは、そのコードでは名前空間のバージョンのみが検索されるため、これは検出されません。さらに、Arnav Borborahの答えでエラーメッセージを投稿したときにコンパイルされません。::operator +friendではないため、プライベートメンバーにアクセスすることはできません。

ので、最も簡単な解決策は、それが宣言一致するように、名前空間内operator+定義を置くために実際にある:

namespace GREGORY_STOCKER_STATICTICIAN 
{ 
    Statistician operator +(const Statistician &s1,const Statistician &s2) 
    { 
     // ... 
    } 
} 

今、あなたはどちらかStatisticianを修飾する必要はありませんが。

0

あなたはこのように、Statisticianクラスの完全な名前を書くことがあります。また

GREGORY_STOCKER_STATICTICIAN::Statistician operator +(const 
    GREGORY_STOCKER_STATICTICIAN::Statistician &s1,const 
    GREGORY_STOCKER_STATICTICIAN::Statistician &s2) 
{ 
    //.... 
} 

は、あなたが長い名前空間名を持つべきではない、それは本当に冗長(エラーからの傾向があるので、タイプミス)、そしてそれはusingステートメントを奨励し、命名の衝突ベースのエラーを奨励します。 2コードのステートメントを使用すると、次のようになります。

代替よりも優れている
using GREGORY_STOCKER_STATICTICIAN::Statistician; 

:あなたはこのエラーは言及しなかったが、また

using GREGORY_STOCKER_STATICTICIAN; 

、あなたのif... elseブロックは中括弧を必要とします、次のように:あなたの前のコードで

if(s1. largest > s2.largest) 
    s3.largest = s1.largest; 
else 
{ 
    s3.smallest = s2.smallest; 
    if(s1. smallest < s2.smallest) 
     s3.smallest = s1.smallest; 
    else 
     s3.smallest = s2.smallest; 
} 

、このコードは、ここで違いを確認していない場合でも、私はあなたがしたくなかったと推定ブロック、外で評価になるだろう。アドバイスとして、メンテナンス性のために、常にif...elseブロックのブレースを入れてください。 また、フレンド機能をoperator+にしたので、名前空間内の最小ブロックスコープに制限されています。 operator+実際のメンバ関数ではなく、友人を作り、それは次のようになりますので、:また

Statistician operator+(const s1& other) 
{ 
    Statistician s3; 
    s3.sum = (s1.sum + this->sum); 
    s3.sequence_length = (s1.sequence_length + this->sequence_length; 
    if(s1.largest > largest) 
     s3.largest = s1.largest; 
    else 
     s3.smallest = this->smallest; 
    if(s1.smallest < this->smallest) 
     s3.smallest = s1.smallest; 
    else 
     s3.smallest = this->smallest; 
    s3.last = s2.last; 
    return s3; 
} 

this->の明示的な使用は、私はちょうど変数が現在のオブジェクトから取られていたことが明らかになった、必要とされていません。

+0

ありがとう私のメンバー変数がプライベートであるというエラーがあることを私に伝えているすべてに名前空間を追加したので、この問題を解決しました。 – CyanMagentaYellowBlack

+0

|| ===ビルド:Staticticianでのデバッグ(コンパイラ:GNU GCCコンパイラ)=== | C:\ Users \ Roger \ Documents \ C++ファイル\ Statictician \ Statictician.h ||関数 'GREGORY_STOCKER_STATICTICAN ::統計演算子+(const GREGORY_STOCKER_STATICTICIAN :: Statistician&、const GREGORY_STOCKER_STATICTICIAN :: Statistician&)':| C:\ Users \ Roger \ Documents \ C++ファイル\ Statictician \ Statictician.h | 57 |エラー: 'double GREGORY_STOCKER_STATICTICIAN :: Statistician :: sum'はプライベートです。 C:\ Users \ Roger \ Documents \ C++ ..ect ... – CyanMagentaYellowBlack

+0

@CyanMagentaYellowBlackこのエラーメッセージのヘルプは、今投稿したソリューションを参照してください。 (この解決方法ともう1つは同じミスを犯し、エラーにつながります) –

関連する問題