c++17 相关问题

C ++ 17是2017年批准的C ++标准的名称。它基于以前的C ++ 14标准,改进了核心语言和标准库,并添加了一些新的语言功能。

如何使用std::stringstream将自定义结构体转换为std::string?

我想将自定义结构体转换为std::string,我想到使用std::stringstream,因为它可以轻松地将各种类型转换为std::string。 模板 我想将一个自定义的结构体转换为std::string,我想到使用std::stringstream,因为它可以轻松地将各种类型转换为std::string。 template<typename T> std::string type_to_string(const T &in) { std::stringstream ss; ss << in; return ss.str(); } struct st_Key { std::string a; int b; char c; ... template<typename OStream> friend OStream &operator<<(OStream &os, const st_Key &c) { // wanted form to output return os << "a" << "=[" << c.a<< "]" << "b" << "=[" << c.b<< "]" << "c" << "=[" << c.c<< "]"; } }; 我想如何转换为 std::string std::string s = type_to_string(st_Key{"a", 1, 'c'}); 但是编译时出现一些错误: <source>: In instantiation of 'OStream& operator<<(OStream&, const st_Key&) [with OStream = std::__cxx11::basic_stringstream<char>]': <source>:14:8: required from 'std::string type_to_string(const T&) [with T = st_Key; std::string = std::__cxx11::basic_string<char>]' <source>:36:35: required from here <source>:31:36: error: invalid initialization of reference of type 'std::__cxx11::basic_stringstream<char>&' from expression of type 'std::basic_ostream<char>' 31 | << "=[" << c.c<< "]"; | ^~~ 那么这有什么问题呢? https://godbolt.org/z/q6zo8r98s 标准库中包含的所有 operator<< 函数不能直接与特定的流类型一起使用。相反,他们采用 std::basic_ostream<CharT, Traits>& 作为参数,并将其用作返回类型。 在您的 operator<<(OStream&, const st_Key&) 中,您尝试返回 std::stringstream&,但 return 语句中使用的输出运算符仅返回基类。将基类引用强制转换回派生类型不是隐式的。 您可以执行与 std 函数相同的操作,并使用 basic_ostream 作为类型,而不是特定流类型的模板: template<typename CharT, typename Traits> friend std::basic_ostream<CharT, Traits> &operator<<(std::basic_ostream<CharT, Traits> &os, const st_Key &c) { // wanted form to output return os << "a" << "=[" << c.a<< "]" << "b" << "=[" << c.b<< "]" << "c" << "=[" << c.c<< "]"; }

回答 1 投票 0

如何将所有 API 调用包装在统一的错误处理程序中?

我正在处理一个供应商提供的 C 库(我们称之为 foo),它提供了大量的 API 调用。所有这些函数都采用(预初始化的)句柄(FOOHandle 类型)并在 su 上返回 0...

回答 1 投票 0

为什么线程返回时thread_local变量没有被销毁?

为了更好地理解这个问题,下面是代码: // 代码1 #包括 #包括 结构 tls_test { tls_测试() { std::cout << "tls_test ...

回答 1 投票 0

如何在 QML 中调整无框窗口的大小?

如何返回无框窗口中边框的调整大小逻辑? 框架窗口具有以下逻辑: QML 中的代码: 导入QtQuick 导入 QtQuick.Controls 2.5 导入 Qt5Compat.GraphicalEffects 导入NR...

回答 4 投票 0

如何导出cpp文件中定义的SFINAE约束的ctor以用于显式实例化的模板类?

这是我的尝试: 定义 Foo 模板类并声明但不定义仅针对 NTTP N 给定值的 ctor 的标头, // foo.hpp #包括 模板 这是我的尝试: 定义 Foo 模板类的标头,并仅针对 NTTP N 的给定值声明但不定义 ctor, // foo.hpp #include <type_traits> template<int N> struct Foo { template<int M = N, std::enable_if_t<M == 2, int> = 0> Foo(int); }; 定义该 ctor 的 cpp 文件并显式实例化 Foo 以获得对应于未 SFINAEd 的 ctor 的值, // foo.cpp #include "foo.hpp" template<int N> template<int M, std::enable_if_t<M == 2, int>> Foo<N>::Foo(int) {} template struct Foo<2>; 主要 TU,实例化 Foo<2> 类的对象, // main.hpp #include "foo.hpp" int main() { Foo<2>{0}; } 如果我尝试编译上面的两个 TU 并链接它们,我会从链接器中收到以下错误: main.cpp:(.text+0x24): undefined reference to `Foo<2>::Foo<2, 0>(int)' collect2: error: ld returned 1 exit status 确实,我没有看到任何来自foo.cpp的符号,因为这个 nm foo.o 没有输出。 如果我添加另一个不受约束的 ctor,例如 // foo.hpp // … struct Foo { Foo(int, int); // … 和 // foo.cpp // … template<int N> Foo<N>::Foo(int, int) {} // … 然后我确实得到了我所期望的: nm foo.o | c++filt 0000000000000000 W Foo<2>::Foo(int, int) 0000000000000000 W Foo<2>::Foo(int, int) 0000000000000000 n Foo<2>::Foo(int, int) 显式实例化模板类不会实例化模板成员函数。 您也需要显式实例化这些方法: template Foo<2>::Foo<2, 0>(int); 演示

回答 1 投票 0

方法指针转换时如何选择const方法重载

我有一个带有重载方法的类: #包括 #包括 结构重载 { 无效 foo() { std::cout << "foo" << std::endl; } ...

回答 1 投票 0

三元运算符在编译时未计算——模板元编程

模板 结构获取; 模板 结构获取> { static_assert(std::false_type::value, "向量索引超出范围!"); };

回答 1 投票 0

如何将对象的方法传递给 lambda 函数?

当前调用一个复杂的“计算器”,如下所示: 结果=计算器.calc(a, b, 额外); 不幸的是,它有时可能会由于服务器上发生不相关的更改而失败...

回答 1 投票 0

带有迭代器的c++ vecotr不能被销毁?

最近我遇到一个问题,程序运行时内存不断增加,而当程序关闭时内存又会恢复正常水平。显然,这是内存泄漏。经过一些工作...

回答 1 投票 0

不接受可变参数模板函数参数

以下代码将无法构建,任何有关原因的反馈将不胜感激。 void bar(std::string str, int& a, int& b) { } 模板 无效 foo(std::fu...

回答 1 投票 0

[[maybe_unused]] 属性不起作用

我试图使用新的 c++17 属性 [[maybe_unused]] 忽略未使用的参数警告,如下所示。 int main([[maybe_unused]] int argc, char** argv) { //... } 但我仍然收到警告:

回答 2 投票 0

将`std::numeric_limits`专门化为`std::byte`是否安全?

令我惊讶的是 std::numeric_limits::digits 返回 0,而我期待的是 8。我相信这是由于缺乏 std::byte 的专业化,因此默认为,好吧,def...

回答 1 投票 0

《C++ Concurrency in Action》一书中的无锁队列实现中的这个“for”循环是什么意思?

我正在阅读 Anthony Williams 的《C++ Concurrency in Action, Second Edition》,我遇到了这段代码: 模板 类lock_free_queue { 私人的: 无效 set_new_tail(

回答 1 投票 0

用 std::string_view 替换所有 const std::string & 是一个不错的选择吗?

我对内存分配和复制非常敏感。因此,如果函数需要 std::string 对象作为输入,我总是使用 const std::string &。 最近,我发现 const std::string & will con...

回答 2 投票 0

用 std::string_view 替换所有 const std::string & 是一个不错的选择吗?

我对内存分配和复制非常敏感,因此,如果函数需要 std::string 对象作为输入,我总是使用 const std::string &。 最近,我发现了 const std::string & will

回答 1 投票 0

有没有办法找到我的代码中所有出现的 std::vector<bool> ?

我管理一个包含很多模板类的大型复杂代码。 我想禁止在代码中使用 std::vector (因为这是编译问题的一个反复出现且痛苦的原因......

回答 1 投票 0

将 `std::string` 临时值传递给 `std::string_view` 参数是否安全?

假设我有以下代码: void some_function(std::string_view 视图) { std::cout << view << '\n'; } int main() { some_function(std::string{"hello, world"}); /...

回答 4 投票 0

另一个命名空间内的 C++ STD 模板专业化

我已经解决了这个需要我将字谜组合在一起的问题。 因此,对于给定的输入,它应该给出以下输出: 输入:strs = ["吃","茶","晒",&qu...

回答 1 投票 0

C++ 中两个迭代器之间的数学运算如何工作?

我是 C++ 新手,正在尝试了解迭代器。到目前为止,我已经了解到迭代器就像指针一样,可用于遍历线性数据结构的元素。但我...

回答 2 投票 0

类模板的成员函数有条件地无效(隐式实例化有效;显式实例化失败)

我创建了一个类模板。根据其模板参数,它支持不同的操作。类模板应(隐式)实例化模板参数的几种组合......

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.