为什么c++重载的output运算符提示无法解析的外部符号啊?

我重载了输出运算符用来输出Queue模板类,但是提示无法解析的外部符号。编译器:vs2013

以下是class的定义和成员的实现:

#ifndef __QUEUE_H__
#define __QUEUE_H__

#include <deque>
#include <iostream>
using namespace std;

template <typename elemtype>
class Queue{
    friend ostream& operator<<(ostream& os, const Queue<elemtype>& que);
public:
    Queue(){}
    Queue(const Queue& que);
    void insert(const elemtype& elem);
    void remove(elemtype& elem);

    bool empty()const;
    Queue& operator=(const Queue& que);
    int size()const;

    elemtype* find(const elemtype& elem);
private:
    deque<elemtype> _que;
    ostream& print(ostream& os = cout)const;
};

//输出运算符
template <typename elemtype>
ostream& operator<<(ostream& os, const Queue<elemtype>& que)
{
    return que.print(os);
}

//拷贝构造函数
template <typename elemtype>
Queue<elemtype>::
Queue(const Queue& que)
{
    *this = que;
}

//插入函数
template <typename elemtype>
void Queue<elemtype>::
insert(const elemtype& elem)
{
    _que.push_front(elem);
}

//移除函数
template <typename elemtype>
void Queue<elemtype>::
remove(elemtype& elem)
{
    if (empty())
    {
        return;
    }
    else
    {
        elem = _que.back();
        _que.pop_back();
    }
}

//是否空
template <typename elemtype>
bool Queue<elemtype>::
empty()const
{
    return _que.empty();
}

//打印
template <typename elemtype>
ostream& Queue<elemtype>::
print(ostream& os)const
{
    for (int i = 0; i < size(); i++)
    {
        os << _que[i] << ' ';
    }
    return os;
}

//赋值操作符
template <typename elemtype>
Queue<elemtype>& Queue<elemtype>::
operator=(const Queue& que)
{
    _que = que._que;
    return *this;
}

//元素个数
template <typename elemtype>
int Queue<elemtype>::
size()const
{
    return _que.size();
}

//查找元素
template <typename elemtype>
elemtype* Queue<elemtype>::
find(const elemtype& elem)
{
    for (int i = 0; i < size(); i++)
    {
        if (_que[i] == elem)
        {
            return &(_que[i]);
        }
    }
    return 0;
}

#endif

以下是测试代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include <string>
#include "queue.h"

int main()
{
    Queue<string> que;
    que.insert("!!!!");
    que.insert("world");
    que.insert("hello");
    que.insert("menglin:");
    cout << que << endl;
    return 0;
}
阅读 1.6k
1 个回答

friend ostream& operator<<(ostream& os, const Queue<elemtype>& que); 这不是一个模板。这是一个普通函数,而它的一个参数是模板类。

template <typename elemtype>
ostream& operator<<(ostream& os, const Queue<elemtype>& que)

而这个是一个模板。所以他们不可能是同一个函数。 friend 函数有定义,而没有实现。


前面一段可以改成这样:

template<typename elemtype> class Queue;
template <typename elemtype>
ostream& operator<<(ostream& os, const Queue<elemtype>& que);

template <typename elemtype>
class Queue{
    friend ostream& operator<< <elemtype>(ostream& os, const Queue<elemtype>& que);

这样 friend 声明里的函数就是一个模板函数了。

推荐问题