gpt4 book ai didi

c++ - 在 C++ 中究竟应该如何正确定义和实现模板类?

转载 作者:太空宇宙 更新时间:2023-11-04 16:19:21 25 4
gpt4 key购买 nike

我最近决定通过编写简单的结构来简化 C++ 开发,从而进行一些个人 C++ 练习。我的第一次尝试是编写一个简单的 LinkedList,但将其定义为模板类,以便它可以处理多种数据类型。在这样做的同时,我做了在头文件中定义类并在 cpp 文件中实现它的标准做法,然后我使用 make 来构建它(使用 686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 )。至于构建 C++ 文件(其中包括 Node.cppLinkedList.cppLinkedListIterator.cpp,一切正常,没有任何投诉。然后我介绍 main.cpp,其中包含主要方法并尝试创建一个 LinkedList<string>(其中工作),然后尝试调用它的长度函数,我都定义并实现了它:

// Other code here
LinkedList<string> *list = new LinkedList<string>();
cout << "Initial length: " << list->length() << endl;
delete list;
list = NULL; // I had defined NULL to be 0, pre 4.6 compiler so nullptr wasn't available
// End the main function

这引发了一个错误,没有 length()为模板化定义了函数 LinkedList<string>类,所以我开始了我的研究,在那里我了解到模板类不能像标准 C++ 类一样以标准头文件/实现格式定义,但这些响应(主要是此处)都没有解决如何正确处理模板类的问题。因此,为了完成我的个人练习,我放弃了 header ,只是定义并实现了 cpp 文件中的类。那里一切正常。

有一些“解决方法”据说可以将实现与定义分开,例如在头文件末尾包含 cpp 文件(这对我不起作用),或者,如果您只希望您的类使用特定类型,在头文件的基础上声明类的静态模板版本,例如:

// Define a template class
template LinkedList<string>;
template LinkedList<int>;
// etc...

我没有尝试过(它可能奏效了,因为我只是在做个人练习,所以它是完全可以接受的)因为这感觉不对。如果将模板类锁定为某些类型,为什么还要创建模板类?我知道您可以轻松地将它锁定到您需要的所有主要类型,为您提供多种数据类型的一个定义,但我不适合以这种方式做事。

TL;DR 最后,我的问题是,在其他人会使用的某种应用程序/库中定义模板类和实现模板类的正确方法是什么?

最佳答案

您需要将所有内容 - 类定义类代码 - 放在标题中。要了解原因,请想象一个简单的案例:

// in .hpp
template <typename T>
T increment(T x);

// in .cpp
template <typename T>
T increment(T x) { return x + 1; }

现在你只编译 .cpp 一次。它应该为 increment 函数生成什么代码? + 运算符可以是浮点加法、整数加法、短整数,甚至是重载的 operator+

然后考虑您正在使用 increment 函数的其他一些 .cpp 文件:

// some other .cpp file
#include "increment.hpp"
...
increment(a);

此时,编译器知道 a 是什么类型,因此它可以为 increment 函数生成正确的代码。但它不知道 increment 函数长什么样,因为它只看到 .hpp 文件,而 increment 的代码在 .cpp 文件。

因此,让它工作的唯一方法是将声明和代码放在 .hpp 文件中,这样每次您使用它时,您就有了定义,编译器可以生成适用于您正在使用的类型的版本。

关于c++ - 在 C++ 中究竟应该如何正确定义和实现模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19033944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com