LINUX.ORG.RU

с++ привести тип std::string к указателю на другой тип

 


1

1

server.cpp:81:66: error: invalid initialization of reference of type ‘const OctetStringPtr&’ {aka ‘const std::shared_ptr<std::vector<unsigned char> >&’} from expression of type ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’}

Или что почитать грамотное про это?

★★★★

Изучи C++ и напиши конвертер из std::string в твой OctetStringPtr. Ни о каком приведении типов тут речь быть не может, это разные структуры, только ручная конвертация своим кодом.

firkax ★★★★★
()
#include <iostream>
#include <vector>
#include <string>
#include <memory>


using namespace std;

int main()
{
    std::string someString = "Some string";

    const std::shared_ptr<std::vector<unsigned char>> veryStrangeData(
        new std::vector<unsigned char>(someString.data(),
                                       someString.data() + someString.size()));

    const std::shared_ptr<std::vector<unsigned char>>& veryStrangeDataReference =
        veryStrangeData;

    for (auto s : *veryStrangeDataReference.get()) {
        std::cout << s << std::endl;
    }
}

Хотя эта конечно ссылка на std::shared_ptr - это сильно.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 3)
Ответ на: комментарий от rumgot

Собралось и кажется работает. Премного благодарен.

Можете вкратце рассказать что и как это работает?

const std::shared_ptr<std::vector> veryStrangeData( new std::vector(someString.data(), someString.data() + someString.size()));

const std::shared_ptr<std::vector>& veryStrangeDataReference = veryStrangeData;

Vlad-76 ★★★★
() автор топика
Последнее исправление: Vlad-76 (всего исправлений: 5)
Ответ на: комментарий от rupert

очень даже могу, только скажите как пройтись? код под linux
речь идет о gdb?

ps понимаю что нужно изучить c++ чтобы подобных вопросов было меньше на LORe, но

мой вопрос звучал не как это работает - дабаг команд ассемблера, а как правильно прочитать эти <> ? * ,объявления переменных, структур

СИ я немного ковырял, но там несколько проще кмк, хоть и что то похоже.

Vlad-76 ★★★★
() автор топика
Ответ на: комментарий от Vlad-76

только скажите как пройтись?

start
n
n
p someString
p veryStrangeData

Если у тебя ещё не настроен отладчик, то нужно либо его настроить, либо подумать о смене профессии.

rupert ★★★★★
()
Ответ на: комментарий от Vlad-76

Пожалуйста, используй теги для оформления кода здесь. https://www.linux.org.ru/help/markdown.md

Можете вкратце рассказать что и как это работает?

  1. Создаем строку.
  2. Создаем умный указатель и при этом передаем ему тут же создаваемый сырой (обычный) указатель на вектор при этом при создании вектора передаем ему в качестве парметров конструктора указатели на начало и конец строки и при этом данные из строки будут скопированы в вектор (т.е. будут и там и там в итоге).
  3. Создаем ссылку на умный указатель, что странно, т.к. если если создается ссылка на умный указатель на вектор, то можно было бы использовать просто ссылку на веткор.

И все бы вопросы отпали бы сами собой, если бы автору (т.е. тебе) почитать учебник по C++ (например Прата).

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 2)
Ответ на: комментарий от Vlad-76

не принципиально что 6ое издание по c++11

Оно нормально будет. А после него уже можно что-то брать с новыми стандартами.

Такого подробного учебника, чтобы сразу с элементорных основ и сразу с элементами C++11/C++14/C++17 (и новые стандарты) - я не знаю на русском. Может на ингише что-то есть, нужно смотреть.

В любом случае в C++ нельзя сразу учить C++17 и выше не выучив того, что C++11 привнес. Ну т.е. было бы можно, если бы учебник давал информацию с основ и сразу прозрачно вводил все что дал текущий стандарт, но и все то что дали предыдущие стандарты и что осталось неизмененным в текущем. Но во многих книгах например по C++17 изложение идет вроде того: «а вот в C++17 появилось то-то и то-то, а раньше было так-то», но при этом те конструкции, которые например появились в C++11 и остались неизменными в C++17 просто могут вообще не обсуждаться.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от Vlad-76

Бери C++17 и выше, это наиболее актуальные стандарты и 17й до сих пор сильно распространён.

«Бьярне Страуструп: Язык программирования C++. Краткий курс»

«Бьярне Страуструп: Программирование. Принципы и практика с использованием C++»

В этих книгах затрагивается C++ в плоть до C++20.

В идеале, чтобы прям всё понимать и закрыть все пробелы, то учишь теорию построения языков программирования, плюс изучаешь сам стандарт языка.

Dr64h ★★★
()