C ++使用模板函数,在main函数

时间:2017-09-28 20:08:11

标签: c++ templates operator-overloading ostream

我在.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;
}

的main.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;
}

1 个答案:

答案 0 :(得分:1)

您正在使用类模板和函数模板。如果我理解正确,你想创建cout周围的包装器,它将模板operator<<用于任何其他类型。现在你声明了为任何其他类型模板化的类。

不同之处在于,您现在需要为intchar以及float等创建单独的包装器...并在打印时使用适当的包装器实例(这将是最好是乏味的。)

要将其用作cout的替代品,请将您的课程更改为非模板化课程,并将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