Может кто-нибудь сказать мне, как это компилируется? (вместо этого sqrt возвращает строку)

Вот мой код Это ошеломляет мой разум.

#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

edit: сначала выложили неверную ошибку компилятора.

edit2: строка 161 — это n = sqrt (n);
Я даже попробовал double x = sqrt (n) и многие другие методы;
Ох, и когда я распечатываю возвращенную строку в моем методе, опубликованном выше, я получаю ошибку сегмента (обв ..)

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

0

Решение

Линия x = sqrt(3.0); зовет ваш RDN::sqrt() метод, который возвращает строку. Я думаю, что вы пытаетесь позвонить sqrt() функция в cmath. Я бы предложил переименовать ваш метод в другое. Кроме того, вы можете позвонить std::sqrt(3.0)

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) делает вашу функцию рекурсивной, а не компилируемой

3

По вопросам рекламы [email protected]