gpt4 book ai didi

c++ - 类模板在其构造函数中的模板变量推导失败

转载 作者:行者123 更新时间:2023-11-28 04:35:23 25 4
gpt4 key购买 nike

这是 C++ 编程的初学者。 (还有英语,抱歉我的英语不好...... ToT)

我搜索了与我的问题相关的主题,但找不到。我希望这篇文章不是重复的。

为了我的目的,我想编写一些包装 ostream 对象的类来操纵输出。

为了我的学习,我正在尝试设计通用输出流类,以便让子类继承 basic_ostream 类模板。

如您所知,basic_ostream 类需要两个模板变量(实际上只有第一个是必需的,另一个默认值为 char_traits<_CharT>)。

但是,我坚持为我的类创建构造函数,以使编译器从构造函数的参数自动推导模板变量。

这是我的类标题的一部分:

#include <ostream>

using namespace std;
template <typename _CharT, typename _Traits = char_traits<_CharT>>
class testOStream : public basic_ostream<_CharT, _Traits> {
public:
using typename basic_ostream<_CharT,_Traits>::__ostream_type;

explicit testOStream(__ostream_type& in)
:__ostream_type (in.rdbuf()), nowStream(in){};

private:
__ostream_type &nowStream;
};

我可以通过显式指定模板变量来实例化上述类,如下所示。

testOStream<ostream::char_type,ostream::traits_type> test1(std::cout);

但是下面一行省略了一个编译错误,就是模板变量推导失败。 (使用 c++17 标准)

testOStream test2(std::cout);

实际上,实际操作上没有问题。但是,我想自动推断变量。有什么办法可以实现我的目标,是否可以用 c++11 标准编译上面的代码?我可以通过放弃使用 basic_ostream 类作为父类来解决这个问题。但是我想知道一个解决方案和这个错误的原因,以供我学习。

我正在寻找您的友好回答,如果 Stack Overflow 上有针对此问题的已解决问题,我对此感到非常抱歉。

谢谢!

最佳答案

在c++17中你可以使用class deduction guide

template<typename T>
testOStream(T&) -> testOStream<typename T::char_type, typename T::traits_type>;

但这不仅会为 std::cout 推导,还会为任何 std::basic_ostream

推导

live

关于c++ - 类模板在其构造函数中的模板变量推导失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51610172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com