这是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上有针对此问题的解决问题,对此我感到非常抱歉。
谢谢!
答案 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
答案 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
(普通,指针或引用)参数,则可以推断出模板类型,但现在不行。