2017-12-05 2 views
0

errormessageクラスのすべての関数がmain関数で機能しているかどうかを調べようとしていますが、その問題はエラー "T" のメッセージと私は削除した機能のSICT ::にErrorMessage ::にErrorMessage(constのSICT ::にErrorMessage &)を参照しようとしていますと言っMAIN.CPPこの関数は削除された関数を参照しようとしていますが、関数はすでに削除されています

でcoutの< <の横にある "E"。

ただし、ヘッダーで削除するように既にこの関数を設定しています。このエラーがなぜ発生するのかについての考えはありますか?あなたの問題はここにある

ヘッダファイル

#ifndef SICT_ERROR_H_ 
#define SICT_ERROR_H_ 
namespace sict { 
    class ErrorMessage { 
     char* m_message; 
    public: 

     ErrorMessage(const char* errorMessage = nullptr); 
     ErrorMessage(const ErrorMessage& em) = delete; 
     ErrorMessage& operator=(const ErrorMessage& em) = delete; 
     virtual ~ErrorMessage(); 
     void clear(); 
     bool isClear() const; 
     void message(const char* str); 
     const char* message() const; 
    }; 
    std::ostream& operator<<(std::ostream& ostr, ErrorMessage); 
} 
#endif 

CPP MAIN.CPP

#include "ErrorMessage.h" 
#include <iostream> 
namespace sict { 

    ErrorMessage::ErrorMessage(const char* errorMessage) { 
     m_message = nullptr; 
     message(errorMessage); 
    } 
    void ErrorMessage::clear() { 
     delete[] m_message; 
     m_message = nullptr; 
    } 
    void ErrorMessage::message(const char* str) { 
     delete[] m_message; 
     m_message = new char[strlen(str) + 1]; 
     strcpy(m_message, str); 
    } 
    const char* ErrorMessage::message() const { 
     return m_message; 
    } 
    ErrorMessage::~ErrorMessage() { 
     clear(); 
    } 
    bool ErrorMessage::isClear() const { 
     if (m_message == nullptr) { 
      return true; 
     } 
     return false; 
    } 
    std::ostream& operator<<(std::ostream& ostr, ErrorMessage error) { 
     if (!(error.isClear())) { 
      ostr << error.message(); 
     } 
     return ostr; 
    } 


} 

を提出

#include <iostream> 
#include "ErrorMessage.h" 

using namespace std; 
using namespace sict; 

int main() { 
    ErrorMessage T("Testing Error Message Module"); 
    ErrorMessage e; 
    int ret = 0; 
    bool ok = true; 
    cout << T << endl << e << endl << "isClear(): " << (e.isClear() ? "Passed!" : "Failed!") << endl; 
    if (!e.isClear()) ok = false; 
    cout << endl; 
    cout << "===========| Long Message\r"; 
    for (int i = 0; i < 10000000; i++) { 
     if (i % 1000000 == 0) { 
      cout << "*"; 
      cout.flush(); 
     } 
     e.message("Some error message that is really long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long" 
      " long long long long long long long long long long long long long"); 
    } 
    cout << '*' << endl; 
    cout << e << endl << "isClear(): " << (e.isClear() ? "Failed!" : "Passed!") << endl; 
    if (e.isClear()) ok = false; 
    cout << endl; 

    e.message("Short Message"); 
    cout << e << endl << e.message() << endl << "isClear(): " << (e.isClear() ? "Failed!" : "Passed!") << endl; 
    if (e.isClear()) ok = false; 

    e.clear(); 
    cout << e << endl << "isClear(): " << (e.isClear() ? "Passed!" : "Failed!") << endl; 
    if (!e.isClear()) ok = false; 
    cout << endl; 

    if (ok) { 
     cout << "You passed all the tests!" << endl; 
    } 
    else { 
     cout << "You did not pass all the tests" << endl; 
     ret = 1; 
    } 

    return ret; 
} 
+0

これは '= delete'が行うはずのものです。あなたはそれを何のために使ってみましたか?おそらく '= default'をしたかったでしょうか? –

答えて

1

それが関数に渡されるために Teをコピー(したがって、削除されたコピーコンストラクタを使用しようとする)必要がありますので、あなたの <<が値によって ErrorMessageを受け入れている
std::ostream& operator<<(std::ostream& ostr, ErrorMessage error) 

const参照渡し試しください:

std::ostream& operator<<(std::ostream& ostr, const ErrorMessage& error) 
+0

今度は、0x0F5B1FD0の矢印に投げられた例外を壊してm_message = new char [strlen(str)+1]; .cpp内のvoid errorMessage(const char * str)にあります。 –

+0

'e'を初期化するときに' str'となるものは何ですか?それはあなたの新しい問題を解決するかどうかは分かりませんが、元の問題が解決されたので別の質問として実際に投稿する必要があります) – vu1p3n0x

+0

お手伝いをありがとうございます! –

関連する問題