我已经从 Bjarne Stroustrup 的C++ 之旅中复制了代码来测试字符串视图,但我不断收到错误:
\nerror: no matching function for call to \xe2\x80\x98std::__cxx11::basic_string<char>::basic_string(std::basic_string_view<char>::size_type\nRun Code Online (Sandbox Code Playgroud)\n我正在使用 VS CodeWSL 2和Ubuntu 20.04gcc-11
在 中main.cpp,我有:
#include <iostream>\n#include "strings.h"\n\nusing namespace std;\n\nint main () {\n string king = "Harold";\n auto s1 = cat(king, "William");\n}\nRun Code Online (Sandbox Code Playgroud)\n中strings.h,我有以下内容。该函数按照教科书上的内容复制。我把它打出来是为了避免*出现具有不同编码的特殊字符。
#pragma once\n#include <string>\n\nusing namespace std;\n\nstring cat(string_view sv1, string_view sv2) {\n string res(sv1.length()+sv2.length());\n char* p = &res[0];\n\n for (char c : sv1) // one way\n …Run Code Online (Sandbox Code Playgroud) 我有以下(修改后的)代码,我想在其中创建对象数组std::string_view。
对应每一行编译时我看到这个错误
\nunable to find string literal operator \xe2\x80\x98operator""sv\xe2\x80\x99 with \xe2\x80\x98const char [8]\xe2\x80\x99, \xe2\x80\x98long unsigned int\xe2\x80\x99 arguments\n "Sensor2"sv,\nRun Code Online (Sandbox Code Playgroud)\n代码:
\n#include <iostream>\n#include <array>\n#include <string_view>\n\nstruct Abc\n{\n static constexpr std::array<std::string_view, 6> SomeValues = {\n "Sensor1"sv,\n "Sensor2"sv,\n "Actuator1"sv,\n "Actuator2"sv,\n "Cpu1"sv,\n "Cpu2"sv\n };\n \n};\n\n\nint main()\n{\n Abc abc;\n \n std::cout << abc.SomeValues[3];\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n 在阅读std::span的文档时,我发现没有方法可以从std::span<T>.
您能建议一种方法来解决我的问题吗?
我的问题的大局(我在另一个问题中问:How to instantiate a std::basic_string_view with custom class T,我得到 is_trivial_v<_CharT> 断言错误)是我想要一个std::basic_string_view<Token>,而这Token不是一个微不足道的问题类,所以我不能使用std::basic_string_view,有人建议我改用std::span<Token>。
由于basic_string_view有一个名为删除第一个元素的方法remove_prefix,而我也需要此类函数,因为我想用作std::span<Token>解析器输入,因此令牌将被匹配,并一个接一个地消耗。
谢谢。
编辑 2023-02-04
我尝试派生一个名为Spanfrom的类std::span,并添加remove_prefix成员函数,但看起来我仍然存在构建问题:
#include <string_view>
#include <vector>
#include <span>
// derived class, add remove_prefix function to std::span
template<typename T>
class Span : public std::span<T>
{
public:
// Inheriting constructors
using std::span<T>::span;
// add a public function which is similar to …Run Code Online (Sandbox Code Playgroud) 在使用C ++进行原型设计和玩耍时,尝试制作可识别utf8的不可变字符串的一些概念,但我遇到了以下难题:
有什么方法可以返回字符串的不变视图。就像,而不是返回子字符串,我希望能够返回引用原始字符串一部分的子字符串。
// Just some quick prototyping of ideas.
// Heavier than just a normal string.
// Construction would be heavier too because of the indices vector.
// Size would end up being O1 though.
// Indexing would also be faster.
struct ustring {
std::string data;
std::vector<size_t> indices;
// How do I return a view to a string?
std::string operator [](size_t const i) const {
return data.substr(indices[i], indices[i + 1] - indices[i]);
}
};
Run Code Online (Sandbox Code Playgroud) 我正在尝试定义我自己的散列函数,std::unordered_map并且我想散列一个结构中的一个字段,该字段应该是键。下面的代码是我所拥有的简化版本:
struct TestStruct {
char a[64];
char b[64];
}
struct my_eq {
bool operator()(const TestStruct& test_1, const TestStruct& test_2) const {
return !strcmp(test_1.a, test_2.a) && !strcmp(test_1.b, test_2.b);
}
};
struct my_hash {
unsigned long operator()(const TestStruct& test) const {
return std::hash<std::string_view>(std::string_view(test.a));
}
};
std::unordered_map<TestStruct, int, my_hash,my_eq> map;
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
no matching function for call to ‘std::hash<std::basic_string_view<char> >::hash(std::string_view&)
Run Code Online (Sandbox Code Playgroud)
根据cppreference上std::hash的hash函数应该支持std::string_view. 我觉得我错过了一些简单的东西,但我无法弄清楚。
除了std :: string_view方法之外,std :: string_view对char*有什么好处吗?
是否有任何理由要重新因数char*为string_view如果没有string_view将用于的方法呢?
我有一个有一堆常量字符串的类,形式如下:
using namespace std::string_view_literals;
class T {
static const constexpr std::string_view something1 = "Alice"sv;
static const constexpr std::string_view something2 = "Bob"sv;
static const constexpr std::string_view something3 = "Charlie"sv;
...
};
Run Code Online (Sandbox Code Playgroud)
我目前using是string_view_literals命名空间,但这不是头文件中的好习惯,并生成警告:
Using namespace directive in global context in header [-Wheader-hygiene] (铛)
literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix] (gcc7)
我想看看其他选择.
直接导入我正在使用的一个文字,而不是整个命名空间
using std::string_view_literals::operator""sv
由于这是一个constexpr常量,也许我应该直接调用构造函数,因为它知道它没有运行时内存或CPU开销:
static const constexpr something1 = std::string_view("Alice");
别的什么?
我有一个函数用于不区分大小写的字符串比较,它std::lexicographical_compare与自定义比较器一起使用.
但是我想能够比较strings,string_views以及const char*相互之间,提供最大的便利和效率.
所以我在想:如果我制作模板,std::string有begin/ end,std::string_view有begin/ end,......但是const char*没有,甚至不是非成员函数的形式.
所以可以像这样定义自己的begin/ end重载
namespace std {
const char * begin(const char* str) { return str; }
const char * end(const char* str) { return str + strlen(str); }
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以比较一切了
std::lexicographical_compare(std::begin(a), std::end(a), std::begin(b), std::end(b), icomp );
Run Code Online (Sandbox Code Playgroud)
?
如果没有,我怎么能解决我的问题?
标准类std::basic_string没有接受类型对象作为其参数的“隐式”构造函数的原因是什么std::string_view?
我希望这个程序能够编译。
#include <iostream>
#include <string>
#include <string_view>
struct A
{
void f( const char *s ) const
{
std::cout << "A::f( " << s << " )\n";
}
};
struct B
{
void f( const std::string &s ) const
{
std::cout << "B::f( " << s << " )\n";
}
};
template <typename... Bases>
struct C : Bases...
{
using Bases::f...;
};
int main()
{
C<A, B>().f( std::string_view( "Hello" ) );
// or
std::string_view s( …Run Code Online (Sandbox Code Playgroud) 根据[string.find#1.2]和[string.find#1.3]:
表单的每个成员函数
constexpr size_type F(const charT* s, size_type pos) const;具有等效于:
return F(basic_string_view<charT, traits>(s), pos);
表单的每个成员函数
constexpr size_type F(const charT* s, size_type pos, size_type n) const;具有等效于:
return F(basic_string_view<charT, traits>(s, n), pos);
这两个find功能都没有的声明noexcept,但所有三个编译器厂商没有按照规则,他们只是执行它noexcept。
这背后的原因是什么?
c++ ×10
string-view ×10
c++17 ×5
string ×4
c++20 ×3
c-strings ×1
constructor ×1
hash ×1
noexcept ×1
refactoring ×1
std-span ×1
templates ×1
windows-subsystem-for-linux ×1
wsl-2 ×1