【问题标题】:Multiple files in Dev-C++, Linker Error. TemplatesDev-C++ 中的多个文件,链接器错误。模板
【发布时间】:2010-12-28 09:18:20
【问题描述】:

我很抱歉我很确定这是一个相当愚蠢的问题,但我无法让它发挥作用!

我也不确定什么信息是太多信息,所以我可能不会提供足够的信息,所以也很抱歉 - 问问吧。

我开始在 main.cpp 中编写一个类,但它变得很大,所以我决定将它转移到不同的源文件。我不太确定如何执行此操作,并且无法从 Internet 资源中找到任何帮助解决此特定问题的方法(因此提出问题)。

我从类定义开始,包括主程序函数之上的所有函数定义。这运行良好。然后我把它分成两个独立的部分。主函数上方的类声明(我认为这是正确的术语)和主函数下方的函数定义。

这也运行得很好。我继续将类声明剪切到头文件中。这个头文件的格式是

#ifndef INC_MATRIX_H
#define INC_MATRIX_H
class matrix{
//ETC
};
#endif

我在某处读到的内容很有用,但我不完全确定为什么,我认为如果标题被多次包含,则停止重新声明函数。

所以目前我们将此头文件与其他包含一起包含在内。然后是 main 函数,然后是 main 函数下面的函数定义。这也可以很好地编译和运行。

我采取的下一步是将函数定义切割成它们自己单独的 .cpp 文件。对该 .cpp 文件所做的唯一添加是必须将一些额外的包含添加到顶部(特别是 iostream 和 cstdlib)。还包括了 matrix.h 文件。

在此配置中,当我尝试编译和运行代码时,Dev-C++ 会引发链接器错误。具体来说,它们的形式是

[链接器错误] 未定义对matrix <bool>::matrix(int, int)的引用

并且代码没有运行(显然)。 我怎样才能解决这个问题?提前致谢。

编辑:已经发现这是因为它是一个模板类,并且在 matrix.cpp 文件的范围内,模板没有被引入 bool 类型。我现在想弄清楚如何在不添加大量代码来单独使每个函数接受每种给定类型的情况下解决此问题。 哦,我很感激我可以在标题中定义函数。但我认为我们不应该这样做?我认为这个想法是您只需包含声明。

【问题讨论】:

  • 这个问题的意思是“教我如何编程!”尽管互联网很棒,但书籍仍然是学习基础知识的更好方法。谷歌搜索和 SO 问题只会让你到目前为止。一旦你掌握了一些基础知识,他们就会更好地回答有针对性的问题。

标签: templates linker-errors dev-c++


【解决方案1】:

错误表明您的矩阵类是模板类。是吗?也许发布代码会有所帮助。

如果它一个模板类,那么请参阅this FAQ,了解将模板类分离为头文件/实现的一般问题的描述,以及该问题的解决方案。

【讨论】:

  • :)。谢谢,肯定是模板问题。阅读了第一个常见问题解答后,我完全理解为什么它不起作用。据我所知,它通过代码寻找你的类的实现,它可以为(在我的情况下)T找到任何类型,然后为 T 编译该类型的特定版本的类。这有点像自动超载。凉爽的。现在来弄清楚如何解决它。
  • 好的,在阅读了常见问题解答的其余部分后,我想知道是否有更好的解决方法?所有的功能都定义在一个单独的模板范围内。 IE。对于每个函数(在标题中预先声明),它们都有模板 位于它们之前。这还不错,即使这样做有点蛮力。但是,如果我必须按照以下方式添加代码,这会导致问题: template matrix::matrix(int, int);因为我必须为每个函数和每个数据类型添加一个。有没有更短的方法来做到这一点?
【解决方案2】:

我认为您可能没有将 matrix.cpp 添加到您的项目中。它必须将其构建到 matrix.o 并将其链接到 main.o 以创建您的 .exe。

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多