【问题标题】:Can't seem to include any cpp file other than main.cpp when using template class使用模板类时似乎无法包含除 main.cpp 之外的任何 cpp 文件
【发布时间】:2012-05-12 14:33:21
【问题描述】:

我决定将必要的代码减少到显示此错误所需的最低限度。我有一个存在于 hc_list.h 文件中的 STL 列表包装模板类。整个代码如下:

// hc_list.h file
#ifndef HC_LIST_H
#define HC_LIST_H

#include <cstdlib>
#include <list>

template <typename T>
class hcList
{
    private:
    std::list<T> selfList ; // a single internal STL list to hold the values

    public:
    hcList(void) {} ;
    ~hcList(void){} ;
    // The error occurs on the line below
    template <typename U> friend std::ostream& operator<<(std::ostream &, const hcList<U> &) ;
} ;
#endif // HC_LIST_H

这段代码包含在main.cpp文件中,main函数如下:

// main.cpp file
#include <iostream>
#include "hc_list.h"
int main()
{
    std::cout << "Begin Test" << std::endl;
    return 0;
}

当输入到 CodeBlocks 项目中时,此代码将按原样编译,出现 0 个错误或警告。但是,然后我包含另一个 cpp 文件并尝试包含列表标题,如下所示:

// anyNamedFile.cpp file
#include "hc_list.h"

当我在项目中包含任何 cpp 文件时,我得到一个编译器错误:

error: expected initializer before '&' token

我不明白我做错了什么,真的可以使用一些帮助。

【问题讨论】:

  • 您的 main 是否实际实例化了 hcVector?你能显示你的operator&lt;&lt;的定义吗?
  • 不。我的 main 只输出“Begin Test”,然后返回 0。
  • 那么它没有实例化模板,模板代码没有完全编译。请贴出相关代码,即operator&lt;&lt;定义。
  • 按要求添加了两块代码。
  • 错误在哪里产生?您发布的代码不完整/不可编译,但看起来不错。

标签: c++ templates


【解决方案1】:

您的头文件使用std::ostream,(就在&amp; 之前)但不包含任何可能声明它的头。

尝试添加

#include <iosfwd>

在您的标题中。

【讨论】:

  • 非常感谢。我将代码添加到我发布的配对示例中,编译器错误消失了。但是,似乎包含此文件会导致输出任何字符串出现问题,并且我得到很多:错误:'endl' 不是'std'的成员
  • 包含&lt;iosfwd&gt; 允许您在声明中使用流,这就是您在标题中所需要的。要真正进行 I/O,你的 .cpp 文件应该包括 &lt;ostream&gt; 和可能的其他头文件。
  • 也许这是因为我对包含的理解从根本上不正确。我一直在阅读的教程都表明我只包含 并且所有这些子库都应该已经包含在 std 命名空间中。为什么我需要去重新指定每个部分?这不是有点像说“我想包括整个字典”然后说“我也想包括所有 M 和 C 字母吗?”
  • 我认为你误解了&lt;cstdlib&gt; 的作用;它不包括所有其他 C++ 头文件。事实上,它是一个相当晦涩的标题。有一些关于拥有包含所有其他头文件的 C++ 头文件的讨论,但目前还没有这样的野兽。所以你只需要包括所有相关的(并了解哪些是 - 这实际上并不像听起来那么糟糕)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2019-08-21
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多