未解决的模板参数

时间:2014-05-18 06:09:48

标签: c++ templates compiler-errors

我今天正在测试一些模板代码,我发现了一些有趣的东西,但我找不到任何理由来解释它为什么会发生。我要求你考虑并启发我的知识。谢谢你的时间。

此代码块正常运行。

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'

我的问题是,为什么编译器无法解析TItem?

2 个答案:

答案 0 :(得分:1)

您需要将该功能设为功能模板。

首先改变运算符的解除度&lt;&lt;在课堂上将TItem纳入其签名

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;
}

答案 1 :(得分:0)

它不知道TItem是什么,它现在移到了课堂模板之外。