我今天正在测试一些模板代码,我发现了一些有趣的东西,但我找不到任何理由来解释它为什么会发生。我要求你考虑并启发我的知识。谢谢你的时间。
此代码块正常运行。
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?
答案 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
是什么,它现在移到了课堂模板之外。