2017-04-10 170 views
0

私は、埋め込み式で代数式を取り、修正後の記法に変換して解決することが1つの機能であるC++プロジェクトに取り組んでいます。ポストフィックスへの変換が適切に機能し、修正後の式を評価するコードが意図したとおりに機能すると思われますが、エラーC2280のためコンパイルできません。ここでは接尾評価のためのコードは、(私は誰もが、彼らが、これはおそらく、どのように貧しい見たときに、それが動脈瘤を持っていることを経験したC++に非常に新しいです)です:C++エラーC2280:削除された関数を参照しようとしています

string EvaluatePostfix(string expression) { 
    double num; 
    double leftOp; 
    double rightOp; 
    string leftOpString; 
    string rightOpString; 
    stringstream numberToPush; 
    double tempResult; 
    string tempResultString; 
    stringstream tempResultSS; 
    stack<stringstream> S; 
    string finalResultString; 


    for (std::size_t i = 0, l = expression.size(); i < l; ++i) { 
     if (expression[i] == '=') 
      break; 
     else if (isalnum(expression[i])) { //If the first character is alphanumeric, get ready to push to stack. 
      while (expression[i] != ' ') { //Wait until hitting space to ensure entire number is pushed, not just 1 digit 
       numberToPush << expression[i]; 
       i++; 
      } 
      S.push(numberToPush); 

     } 

     else if (IsOperator(expression[i])) { //When an operator is hit, top two strings are taken from stack and converted to double. 
      switch (expression[i]) {   //Operation is applied, they are converted back to string and result is pushed onto stack 
      case '+': 
       leftOpString == S.top().str(); 
       S.pop(); 
       rightOpString == S.top().str(); 
       S.pop(); 
       leftOp = atof(leftOpString.c_str()); 
       rightOp = atof(rightOpString.c_str()); 
       tempResult = leftOp + rightOp; 
       tempResultString = to_string(tempResult); 
       for (int i = 0; i < tempResultString.length() - 1; i++) { 
        tempResultSS << tempResultString.at(i); 
       } 
       S.push(tempResultSS); 
       break; 
      case '-': 
       leftOpString == S.top().str(); 
       S.pop(); 
       rightOpString == S.top().str(); 
       S.pop(); 
       leftOp = atof(leftOpString.c_str()); 
       rightOp = atof(rightOpString.c_str()); 
       tempResult = leftOp - rightOp; 
       tempResultString = to_string(tempResult); 
       for (int i = 0; i < tempResultString.length() - 1; i++) { 
        tempResultSS << tempResultString.at(i); 
       } 
       S.push(tempResultSS); 
       break; 
      case '*': 
       leftOpString == S.top().str(); 
       S.pop(); 
       rightOpString == S.top().str(); 
       S.pop(); 
       leftOp = atof(leftOpString.c_str()); 
       rightOp = atof(rightOpString.c_str()); 
       tempResult = leftOp * rightOp; 
       tempResultString = to_string(tempResult); 
       for (int i = 0; i < tempResultString.length() - 1; i++) { 
        tempResultSS << tempResultString.at(i); 
       } 
       S.push(tempResultSS); 
       break; 
      case '/': 
       leftOpString == S.top().str(); 
       S.pop(); 
       rightOpString == S.top().str(); 
       S.pop(); 
       leftOp = atof(leftOpString.c_str()); 
       rightOp = atof(rightOpString.c_str()); 
       tempResult = leftOp/rightOp; 
       tempResultString = to_string(tempResult); 
       for (int i = 0; i < tempResultString.length() - 1; i++) { 
        tempResultSS << tempResultString.at(i); 
       } 
       S.push(tempResultSS); 
       break; 
      case '^': 
       leftOpString == S.top().str(); 
       S.pop(); 
       rightOpString == S.top().str(); 
       S.pop(); 
       leftOp = atof(leftOpString.c_str()); 
       rightOp = atof(rightOpString.c_str()); 
       tempResult = pow(leftOp, rightOp); 
       tempResultString = to_string(tempResult); 
       for (int i = 0; i < tempResultString.length() - 1; i++) { 
        tempResultSS << tempResultString.at(i); 
       } 
       S.push(tempResultSS); 
       break; 
      } 
     } 
    } 
    finalResultString == S.top().str(); 
    return finalResultString; 

} 

ここでは全体のエラーメッセージは次のとおりです。

Error C2280 'std::basic_stringstream<char,std::char_traits<char>,std::allocator<char>>::basic_stringstream(const std::basic_stringstream<char,std::char_traits<char>,std::allocator<char>> &)': attempting to reference a deleted function ConsoleApplication2 c:\program files (x86)\microsoft visual studio 14.0\vc\include\xmemory0 737 

そして、ここでは、それはエラーがあるという行を含む行733-738、以下のとおりです。

template<class _Objty, 
    class... _Types> 
    void construct(_Objty *_Ptr, _Types&&... _Args) 
    { // construct _Objty(_Types...) at _Ptr 
    ::new ((void *)_Ptr) _Objty(_STD forward<_Types>(_Args)...); 
    } 

は誰が正しい方向towarに私を指すことができれば、私はそれを大幅に感謝これを修正する。

+2

*あなたのコードのどの行が停止していますか?呼び出しスタックを見て、最終的にこの関数を呼び出すプログラムの行を確認してください。 – PaulMcKenzie

+1

@PaulMcKenzieこれはコンパイラエラーではありませんか? – Barmar

+1

でも、ある時点のエラーメッセージには、最終的にその関数を呼び出すコード行が表示されます。 – PaulMcKenzie

答えて

1

バーマン製とHairyDuckによって与えられる回答にstringstream基準に従って

コピー(3)
にstringstream(CONSTにstringstream &)が削除されたオペレータをコピー状態

http://www.cplusplus.com/reference/sstream/stringstream/stringstream/

のコメントによると=削除;

と仮定してスタックがプッシュ

は、「現在の最上位の要素の上に、スタックの一番上に新しい要素を挿入することを指定するのstd ::スタックです。この新しい要素の内容は、のコピーに初期化されますヴァル " http://www.cplusplus.com/reference/stack/stack/push/

=>コピーできないタイプのstack :: pushは使用しないでください。

関連する問題