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

时间:2018-07-31 09:35:20

标签: c++ templates

这是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上有针对此问题的解决问题,对此我感到非常抱歉。

谢谢!

2 个答案:

答案 0 :(得分:1)

在c ++ 17中,您可以使用类推导指南

Travel_survey$distance_primact <- mapply(function(d,nums){sum(d[nums],na.rm=F)},d=disti,nums=touri) - primary_act

但这不仅会推论template<typename T> testOStream(T&) -> testOStream<typename T::char_type, typename T::traits_type>; ,还会推论任何std::cout

live

答案 1 :(得分:0)

如评论中所述,C ++ 17中存在类模板推论。但是没有任何推论指南(就像函数一样),它必须是直接推论,而不是像Builder(或任何 drawer: Builder(builder: (context) => Drawer( child: ListView( children: <Widget>[ ListTile( title: Text("Next Page"), onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) => NextPage())); }, ) ], ), ), ), 派生对象)那样的间接推论。

如果您的构造函数采用std::cout(普通,指针或引用)参数,则可以推断出模板类型,但现在不行。