c++ - 未解析的模板参数

标签 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 ?

最佳答案

您需要将函数设为函数模板。

首先改变类中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/

相关文章:

c++ - 使用模板元编程计算数据编译时间

linux - 当库存在时,是什么导致 gcc 中出现找不到库错误?

php - PHP中的 undefined variable 错误。我该如何解决?

java - 反编译的代码导致 “Cannot reference a field before it is defined”

c++ - 如何解决用于在 C++ 中维护静态局部变量的服务数据的线程安全问题?

c++ - 为什么没有从指针到对 const 指针的引用的隐式转换

android - 使用 JNI 将长值传递给 Java

c++ - 类模板和函数模板的区别

c++ - 如果其中一个为真,则 && 循环结束,而不是如果两个都为真

c++ - 为什么专用模板函数不能同时接受类型及其常量版本?