требуется преобразование из 'std :: string' в нескалярный тип - PullRequest
3 голосов
/ 05 сентября 2010

У меня проблемы с реализацией моего класса.Он должен быть в состоянии инициализировать из std :: string.Поэтому я написал конструктор копии (?):

CVariable (std::string&, const int p_flags = 0);

Я пытаюсь создать объект CVariable:

MCXJS::CVariable s_var = (string)"good job";

Я получаю следующую ошибку:

F:\Projekty\MCXJS\src\main.cpp|8|error: conversion from 'std::string' to non-scalar type 'MCXJS::CVariable' requested|

Как это исправить?

Я ИЩУ РЕШЕНИЕ, КОТОРОЕ ПОЗВОЛЯЕТ ЧТО-ТО ИМЕННО КАК СЛЕДУЕТ:

MCXJS::CVariable s_var = (string)"good job";

Редактировать: добавить (почти) полный исходный код:

cvariable.h

#ifndef CVARIABLE_H
#define CVARIABLE_H

#include <string>
#include <sstream>

namespace MCXJS
{
enum VARTYPE
{
    STRING = 0,
    INT = 1,
    FLOAT = 2
};

class CVariable
{
    public:
    VARTYPE Type () {return m_type;};
    std::string& Value () {return m_value;};
    bool SetType (VARTYPE);

    private:
    const int m_flags;
    VARTYPE m_type;
    std::string m_value;

    // ctors and operators
    public:
    CVariable (const int p_flags = 0);
    CVariable (CVariable&, const int);
    CVariable (std::string const&, const int);
    CVariable (const int&, const int);
    CVariable (const float&, const int);

    CVariable& operator= (const CVariable&);
    CVariable& operator= (const std::string&);
    CVariable& operator= (const int);
    CVariable& operator= (const float);
};
};

#endif // CVARIABLE_H

cvariable.cpp

#include "cvariable.h"

using namespace MCXJS;
using namespace std;

CVariable::CVariable (const int p_flags):
m_flags (p_flags)
{};

CVariable::CVariable (CVariable& p_var, const int p_flags = 0):
m_flags (p_flags),
m_type (p_var.Type()),
m_value (p_var.Value())
{};

CVariable::CVariable (std::string const& p_value, const int p_flags = 0):
m_flags (p_flags),
m_type (STRING),
m_value (p_value)
{};

CVariable::CVariable (const int p_value, const int p_flags = 0):
m_flags (p_flags),
m_type (INT)
{
std::ostringstream buffer;
buffer << p_value;
m_value = buffer.str();
};

CVariable::CVariable (const float p_value, const int p_flags = 0):
m_flags (p_flags),
m_type (FLOAT)
{
std::ostringstream buffer;
buffer << p_value;
m_value = buffer.str();
};

main.cpp

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

using namespace std;

int main()
{
MCXJS::CVariable s_var = (string)"good job"; // error
cout << s_var.Value() << '\n';
return 0;
}

Редактировать: добавить enum VARPARAM

Редактировать: ОК, решено выше, теперь у меня есть это:

cvariable.cpp|12|error: passing 'const MCXJS::CVariable' as 'this' argument of 'MCXJS::VARTYPE MCXJS::CVariable::Type()' discards qualifiers|
cvariable.cpp|13|error: passing 'const MCXJS::CVariable' as 'this' argument of 'std::string& MCXJS::CVariable::Value()' discards qualifiers|

Ответы [ 3 ]

6 голосов
/ 05 сентября 2010

Вы должны принять это по константной ссылке

CVariable (std::string const&, const int p_flags = 0);

Нет смысла принимать временный результат преобразования по неконстантной ссылке.Изменения этого параметра будут просто потеряны после этого.Сделать так, чтобы это было константной ссылкой, легко, поэтому стандарт C ++ просто запрещает это.

0 голосов
/ 06 сентября 2010

MCXJS :: CVariable s_var = (строка) "хорошая работа";

Это опечатка?Должно быть MCXJS::CVariable s_var = { 0, STRING, std::string("good job") }; или даже лучше, явно - MCXJS::CVariable s_var(std::string("good job"), 0);.

0 голосов
/ 05 сентября 2010

Вы не добавили определение перегрузки оператора '=' в свой пример кода? Вам необходимо правильно определить, что происходит, когда вы присваиваете строку своему объекту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...