我今天测试了一些模板代码,我发现了一些有趣的东西,但我找不到任何充分的理由来解释为什么会这样。我请求你考虑并用你的知识启发我。感谢您的宝贵时间。
这个代码块没有问题。
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 ?
最佳答案
您需要将函数设为函数模板。
首先改变类中operator<<的decleration,将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;
}
关于c++ - 未解析的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23719076/