0

这是我的代码。这让我难以置信。

#include <iostream>
#include <sstream>
#include <set>
#include <cmath>
#include <cstdlib>
#include "list.h"
#include "stack.h"
#include <limits>
#define PI 3.1415926535897932384626433832795

class RPN : public Stack<float> {
      public:
             std::string sqrt(float n); 
};

std::string RPN::sqrt(float n){
    std::string x;
    x = sqrt(3.0);
    std::ostringstream ss;
    ss << n;
    return (ss.str());
}

是的,正在编译。sqrt 正在返回一个字符串。尝试使用双精度或浮点数会引发奇怪的错误。谁能告诉我发生了什么?我以前从未有过这个。有趣的是,我实际上稍后会转换为字符串,但我怀疑这会编译其他任何地方......

postfix.cpp: In member function ‘std::string RPN::sqrt(float)’:
postfix.cpp:161:13: error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘float’ in assignment

编辑:首先发布了错误的编译器错误。

edit2:第 161 行是 n=sqrt(n); 我什至尝试过 double x = sqrt(n) 和许多其他方法;哦,当我在上面发布的方法中打印出 retrned 字符串时,我得到一个段错误(obv ..)

std::string RPN::sqrt(float n) {
    n = sqrt(n);
    std::ostringstream ss;
    ss << n;
    return (ss.str());
}
4

2 回答 2

3

让我们更仔细地看一下代码

std::string RPN::sqrt(float n){
    std::string x; // temporary string variable

    // calling sqrt with 3.0? What?
    // This call actually would make this function be recursive 
    // (it would hide ::sqrt), making the assignment possible 
    // to compile (as sqrt returns a string)
    // This also means that the function will 
    // eventually cause a stack overflow as there is no break case.
    x = sqrt(3.0); 

    std::ostringstream ss; // temporary string stream
    ss << n; // putting x in the string stream

    // returning the string value of the string stream
    // (i.e. converting x to a string)
    return (ss.str()); 
}

换句话说,没有编译错误,但如果你运行该代码,你会得到一个运行时错误。

编辑:

尝试n = ::sqrt(n)(或者n = std::sqrt(n)如果您#include <cmath>)而不是n = sqrt(n),因为这只会调用您自己定义的函数,因为您的函数将掩盖全局范围。

n = sqrt(n)使您的函数递归,而不是编译。

于 2013-04-16T11:47:19.560 回答
3

该行x = sqrt(3.0);正在调用您的RDN::sqrt()方法,该方法返回一个字符串。我认为您正在尝试sqrt()在 cmath 中调用该函数。我建议将您的方法重命名为其他名称。或者,您也许可以致电std::sqrt(3.0)

于 2013-04-16T11:47:27.720 回答