首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

<<运算符泛型重载的有关问题

2012-08-09 
运算符泛型重载的问题?num_sequence.h文件C/C++ code#ifndef NUM_SEQUENCE_H_INCLUDED#define NUM_SEQUE

<<运算符泛型重载的问题?
num_sequence.h文件

C/C++ code
#ifndef NUM_SEQUENCE_H_INCLUDED#define NUM_SEQUENCE_H_INCLUDED#include<iostream>#include<vector>using namespace std;template<int len, int beg_pos>class num_sequence {    friend ostream& operator<< (ostream &os, const num_sequence<len,beg_pos> &ns) ;public:    virtual  ~num_sequence() {};    int     elem( int pos ) const;    const char* what_am_i() const;    static int   max_elems() { return _max_elems;}    virtual ostream& print(ostream &os = cout) const;protected:    virtual  void gen_elems( int pos ) const = 0;    bool    check_integrity( int pos, int size ) const;    num_sequence(vector<int> *p) : _pelems(p) {}    static const int _max_elems = 1024;    vector<int> *_pelems;};#endif // NUM_SEQUENCE_H_INCLUDED

num_sequence.cpp
C/C++ code
#include<iostream>#include<vector>#include"num_sequence.h"using namespace std;template<int len, int beg_pos>int num_sequence<len,beg_pos>::elem( int pos ) const {    if ( !check_integerity(pos,_pelems->size()))        return 0;    return (*_pelems)[pos-1];}template<int len, int beg_pos>const char* num_sequence<len,beg_pos>::what_am_i() const {    return typeid(*this).name();}template<int len, int beg_pos>ostream& num_sequence<len,beg_pos>::print(ostream &os) const {    int elem_pos = beg_pos - 1;    int end_pos = beg_pos + len;    if ( !check_integrity(elem_pos,end_pos))        return os;    while(elem_pos < end_pos) {        os << (*_pelems)[elem_pos++] << ' ';    }    return os;}template<int len, int beg_pos>bool num_sequence<len,beg_pos>::check_integrity(int pos, int size) const {    if ( pos < 0 || pos > _max_elems)        return false;    if(pos > size)        gen_elems(pos);    return true;}template<int len, int beg_pos>ostream& operator<< (ostream &os, const num_sequence<len,beg_pos> &ns)  {    ns.print(os);    return os;}

Fibonacci.cpp文件
C/C++ code
#include"num_sequence.h"#include<iostream>using namespace std;template<int len, int beg_pos=1>class Fibonacci : public num_sequence<len,beg_pos> {    friend ostream& operator<< (ostream &os, const num_sequence<len,beg_pos> &ns) ;public:    Fibonacci() : num_sequence<len,beg_pos>(&_elems){}    void print(ostream& os) { num_sequence<len,beg_pos>::print(os);}private:    virtual void gen_elems( int pos ) const;    static vector<int> _elems;};template<int len, int beg_pos>vector<int> Fibonacci<len,beg_pos>::_elems;template<int len, int beg_pos>void Fibonacci<len,beg_pos>::gen_elems( int pos ) const {    if ( _elems.size() <= 2) {        _elems.push_back(1);        _elems.push_back(1);    }    int length = _elems.size();    if (length <= pos) {        int n_1 = _elems[length - 2];        int n_2 = _elems[length - 1];        int sum;        while( length < pos ) {            sum = n_1 + n_2;            _elems.push_back(sum);            n_1 = n_2; n_2 = sum;            length++;        }    }}int main() {    Fibonacci<8> fib1;    //fib1.print(cout);    cout << fib1;   //这里编译错误    return 0;}


cout << fib1;编译报错 错误信息是:

obj\Debug\Fibonacci.o||In function `ZNSt24__copy_backward_dispatchIPiS0_11__true_typeE4copyEPKiS4_S0_':|
]+0x10)||undefined reference to `num_sequence<8, 1>::print(std::ostream&) const'|


]+0x10)||undefined reference to `num_sequence<8, 1>::print(std::ostream&) const'|

是哪里错了~ ,没template实例化吗?怎么实例化。

[解决办法]
模板类不支持分离编译,所有的申明定义都必须放在一个文件里。

热点排行