gpt4 book ai didi

C++使用模板函数,在主函数中定义一个具有ostream类变量的构造函数

转载 作者:行者123 更新时间:2023-11-28 04:59:15 24 4
gpt4 key购买 nike

我在 .h 文件中定义了模板类,它包括定义一个具有 ostream 类的构造函数。我不知道如何在 main 中使用构造函数。

最初,我想对来自输入的流的 ASCII 代码求和,我需要用模板类来完成,而不是为每种类型的变量编写它。

.h文件

#ifndef SPYOUTPUT_H
#define SPYOUTPUT_H
#include <iostream>
using namespace std;
template <class T>
class SpyOutput {
int Count, CheckSum;
ostream* spy;
public:
int getCheckSum();
int getCount();

~SpyOutput();
SpyOutput(ostream* a);
SpyOutput & operator << (T val);
}
#endif

.cpp

template <class T>
SpyOutput<T>::SpyOutput(std::ostream* a) {
spy = a;
Count = 0;
CheckSum = 0;
}

template <class T> SpyOutput<T>::~SpyOutput() {}

template <class T> SpyOutput<> & SpyOutput<T>::operator << (T val) {
stringstream ss;
ss << val;
string s;
s = ss.str();
*spy << s;
Count += s.size();
for (unsigned int i = 0; i < s.size(); i++) {
CheckSum += s[i];
}
return *this;
}

template <class T>
int SpyOutput<T>::getCheckSum() {
return CheckSum;
}

template <class T>
int SpyOutput<T>::getCount() {
return Count;
}

主要.cpp

#include "SpyOutput.h"
#include <iostream>
#define endl '\n'

int main()
{
double d1 = 12.3;
int i1 = 45;
SpyOutput spy(&cout); // error agrument list of class template is missing
/*
template <class T> SpyOutput<T> spy(&cout); // not working error
SpyOutput<ostream> spy(&cout);
// not working error having error on operator <<not matches with these oprands
*/

spy << "abc" << endl;
spy << "d1=" << d1 << " i1=" << i1 << 'z' << endl;

cout << "count=" << spy.getCount() << endl;
cout << "Check Sum=" << spy.getCheckSum() << endl;
return 0;
}

最佳答案

您正在混合使用类模板和函数模板。如果我理解正确,你想围绕 cout 创建包装器这将模板化operator<<与任何其他类型一起使用。现在您声明为任何其他类型模板化的类。

区别在于现在您需要为 int 创建单独的包装器和 charfloat等等......并在打印时使用适当的包装器实例(这充其量是乏味的)。

将其用作 cout 的直接替代品将您的类(class)更改为非模板类(class),然后制作 operator<<像这样的模板:

#ifndef SPYOUTPUT_H
#define SPYOUTPUT_H

#include <iostream>

class SpyOutput {
int Count, CheckSum;
std::ostream* spy;
public:
int getCheckSum();
int getCount();

~SpyOutput();
SpyOutput(std::ostream* a);
template <class T>
SpyOutput & operator << (T val) {
// here copy the implementation from .cpp
// so that template is instantiated for
// each type it is used with
}
}
#endif

关于C++使用模板函数,在主函数中定义一个具有ostream类变量的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46477471/

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