未解析的模板参数

Unresolved template argument

本文关键字:参数      更新时间:2023-10-16

我今天正在测试一些模板代码,我发现了一些有趣的事情,但我找不到任何好的理由来解释为什么会发生这种情况。我请求你用你的知识来考虑和启发我。谢谢你的宝贵时间。

这个代码块运行正常。

template<class TItem>
class PrintableQueue : public queue<TItem> {
    public:
        friend ostream& operator<<(ostream& os, const PrintableQueue<TItem>& queue) {
            copy(queue.c.begin(), queue.c.end(), ostream_iterator<TItem>(os, " "));
            return os;
        }
};
int main(int argc, const char* argv[])
    PrintableQueue<int> queue;
    queue.push(1);
    queue.push(2);
    cout << queue;
}

然而,当我把友元函数的定义放在类的外部时,它不起作用。

template<class TItem>
class PrintableQueue : public queue<TItem> {
    public:
        friend ostream& operator<<(ostream& os, const PrintableQueue<TItem>& queue);
};
ostream& operator<<(ostream& os, const PrintableQueue<TItem>& queue) {
    copy(queue.c.begin(), queue.c.end(), ostream_iterator<TItem>(os, " "));
    return os;
}

我得到的错误如下。

'TItem' : undeclared identifier
'PrintableQueue' : 'TItem' is not a valid template type argument for parameter 'TItem'

我的问题是,为什么编译器不能解析item ?

你需要让函数成为一个函数模板。

首先改变操作符<<的声明。并将item包含到其签名

friend ostream& operator<< <TItem>(ostream& os, const PrintableQueue<TItem>& queue);

然后将函数定义更改为模板函数

template <typename TItem>
ostream& operator<<(ostream& os, const PrintableQueue<TItem>& queue) {
    copy(queue.c.begin(), queue.c.end(), ostream_iterator<TItem>(os, " "));
    return os;
}

它不知道TItem是什么,现在它被移出了类模板