Какая связь между string_view и basic_string<char> и почему пример кода string_view не работает?

Я скопировал код из A Tour of C++ Бьярна Страуструпа, чтобы протестировать представления строк, но я продолжаю получать сообщение об ошибке:

      error: no matching function for call to ‘std::__cxx11::basic_string<char>::basic_string(std::basic_string_view<char>::size_type

Я использую VS-код WSL 2с Ubuntu 20.04а также gcc-11

в main.cpp, У меня есть:

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

using namespace std;

int main () {
    string king = "Harold";
    auto s1 = cat(king, "William");
}

в strings.h, у меня следующее. Функция копируется как в учебнике. Я напечатал это, чтобы избежать своеобразного *символ, который имел другую кодировку.

      #pragma once
#include <string>

using namespace std;

string cat(string_view sv1, string_view sv2) {
    string res(sv1.length()+sv2.length());
    char* p = &res[0];

    for (char c : sv1)                  // one way
        *p++ = c;
    copy(sv2.begin(), sv2.end(), p);    // another way
    return res;
}

С использованием Ctrl+F5команда выдает эту ошибку.

      In file included from main.cpp:2:
strings.h: In function ‘std::string cat(std::string_view, std::string_view)’:
strings.h:7:41: error: no matching function for call to ‘std::__cxx11::basic_string<char>::basic_string(std::basic_string_view<char>::size_type)’
    7 |     string res(sv1.length()+sv2.length());
      |                                         ^
In file included from /usr/include/c++/11/string:55,
                 from /usr/include/c++/11/bits/locale_classes.h:40,
                 from /usr/include/c++/11/bits/ios_base.h:41,
                 from /usr/include/c++/11/ios:42,
                 from /usr/include/c++/11/ostream:38,
                 from /usr/include/c++/11/iostream:39,
                 from main.cpp:1:
/usr/include/c++/11/bits/basic_string.h:650:9: note: candidate: ‘template<class _Tp, class> std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Tp&, const _Alloc&) [with _Tp = _Tp; <template-parameter-2-2> = <template-parameter-1-2>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
  650 |         basic_string(const _Tp& __t, const _Alloc& __a = _Alloc())
      |         ^~~~~~~~~~~~
/usr/include/c++/11/bits/basic_string.h:650:9: note:   template argument deduction/substitution failed:
In file included from /usr/include/c++/11/bits/move.h:57,
                 from /usr/include/c++/11/bits/nested_exception.h:40,
                 from /usr/include/c++/11/exception:148,
                 from /usr/include/c++/11/ios:39,
                 from /usr/include/c++/11/ostream:38,
                 from /usr/include/c++/11/iostream:39,
                 from main.cpp:1:

Я сделал снимок экрана того, что я вижу в коде Visual Studio, чтобы показать подчеркнутый код, который не делает

Я думал, что это может быть редактор кода, но Godbolt показывает аналогичные ошибки.

Поскольку это связано с Vs Code, вот мои

launch.json

      {
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++-11 - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++-11 build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

а также c_cpp_properties.json

      {
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++20",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

1 ответ

Да, это кажется неправильным.

Линия

      string res(sv1.length()+sv2.length());

должно быть

      string res(sv1.length()+sv2.length(), '\0');

std::stringне имеет конструктора, который принимает только аргумент размера, в отличие от std::vector. Значение, которым должны быть инициализированы элементы, должно быть указано явно.


Однако я не смог найти эту ошибку в списке опечаток здесь .

Другие вопросы по тегам