【问题标题】:Unresolved template argument未解析的模板参数
【发布时间】:2014-05-18 06:09:47
【问题描述】:

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

此代码块运行正常。

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 ?

【问题讨论】:

  • TItem 在类定义的范围内。您将其移出类定义。

标签: c++ templates compiler-errors


【解决方案1】:

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

首先改变类中操作符

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

【讨论】:

  • 我得到的错误;错误 LNK2019:未解析的外部符号“类 std::basic_ostream > & __cdecl operator > &,class Printa bleQueue const &)" (??6@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AEAV01@AEBV?$PrintableQueue@H@@@Z) 在函数中引用" void __cdecl app3_queue(void)" (?app3_queue@@YAXXZ) 2>D:\workspace\tcppv2\4.container.others\build\Release\run.exe : 致命错误 LNK1120: 1 unresolved externals
  • @MuratKarakuş, ostream_iterator&lt;TItem&gt; 只有在 operator&lt;&lt; 定义在 std::ostreamTItem 之间时才有效。您需要提供该重载的实现。
  • @Sahu 我不明白你之前的评论,但我通过更新函数签名解决了它。以前,我忘记更新函数签名,因此导致了上述错误。感谢您的贡献
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2023-04-05
    • 2014-12-04
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多