Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中,模板类应该如何正确定义和实现+;? 我最近决定编写简单的结构来进行个人C++实践,以方便C++开发。我的第一次尝试是编写一个简单的LinkedList,但将其定义为一个模板类,以便它能够处理多种数据类型。在这样做时,我做了在头文件中定义类并在cpp文件中实现它的标准实践,然后使用make构建它(使用686-apple-darwin11-llvm-g++-4.2(GCC)4.2.1)。对于C++文件的构建(包括节点.CPP , LIKEDLIST.CPP和 Link KyristTyter。CPP < /代码>所有的工作都很好,没有抱怨。然后介绍 main .CPP < /C> >,其中包含主方法并试图创建链接目录> /代码>(工作)然后尝试调用我定义并实现的长度函数: // 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_C++_Templates - Fatal编程技术网

在C+中,模板类应该如何正确定义和实现+;? 我最近决定编写简单的结构来进行个人C++实践,以方便C++开发。我的第一次尝试是编写一个简单的LinkedList,但将其定义为一个模板类,以便它能够处理多种数据类型。在这样做时,我做了在头文件中定义类并在cpp文件中实现它的标准实践,然后使用make构建它(使用686-apple-darwin11-llvm-g++-4.2(GCC)4.2.1)。对于C++文件的构建(包括节点.CPP , LIKEDLIST.CPP和 Link KyristTyter。CPP < /代码>所有的工作都很好,没有抱怨。然后介绍 main .CPP < /C> >,其中包含主方法并试图创建链接目录> /代码>(工作)然后尝试调用我定义并实现的长度函数: // 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

在C+中,模板类应该如何正确定义和实现+;? 我最近决定编写简单的结构来进行个人C++实践,以方便C++开发。我的第一次尝试是编写一个简单的LinkedList,但将其定义为一个模板类,以便它能够处理多种数据类型。在这样做时,我做了在头文件中定义类并在cpp文件中实现它的标准实践,然后使用make构建它(使用686-apple-darwin11-llvm-g++-4.2(GCC)4.2.1)。对于C++文件的构建(包括节点.CPP , LIKEDLIST.CPP和 Link KyristTyter。CPP < /代码>所有的工作都很好,没有抱怨。然后介绍 main .CPP < /C> >,其中包含主方法并试图创建链接目录> /代码>(工作)然后尝试调用我定义并实现的长度函数: // 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,c++,templates,C++,Templates,我没有试过(这可能有用,而且因为我只是做个人练习,所以完全可以接受)因为这感觉不对。如果将模板类锁定为某些类型,为什么要创建一个模板类?我知道可以轻松地将其锁定为所有需要的主要类型,为几种数据类型提供一个定义,但这样做并不适合我 TL;DR最终我的问题是,定义模板类并在其他人使用的某种应用程序/库中实现模板类的正确方法是什么?模板必须在实例化时可见。如果没有显式实例化,基本上意味着成员函数定义必须在标头中提供s,以便其他翻译单元对其进行实例化。模板必须在实例化点可见。如果没有显式实例化,这基本上

我没有试过(这可能有用,而且因为我只是做个人练习,所以完全可以接受)因为这感觉不对。如果将模板类锁定为某些类型,为什么要创建一个模板类?我知道可以轻松地将其锁定为所有需要的主要类型,为几种数据类型提供一个定义,但这样做并不适合我


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

模板必须在实例化时可见。如果没有显式实例化,基本上意味着成员函数定义必须在标头中提供s,以便其他翻译单元对其进行实例化。

模板必须在实例化点可见。如果没有显式实例化,这基本上意味着成员函数定义必须在标头中提供,以便其他翻译单元对其进行实例化。

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

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

// in .cpp
template <typename T>
T increment(T x) { return x + 1; }
此时,编译器知道
a
是什么类型,因此可以为
increment
函数生成正确的代码。但它不知道
increment
函数是什么样子,因为它只看到.hpp文件,
increment
的代码在.cpp文件中


因此,使其工作的唯一方法是将声明和代码放在.hpp文件中,以便每次使用它时,您都有定义,编译器可以为您使用的类型生成正确的版本。

您需要将所有内容(类定义和类代码)都放在头中。要了解原因,请想象一个简单的case:

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

// in .cpp
template <typename T>
T increment(T x) { return x + 1; }
此时,编译器知道
a
是什么类型,因此可以为
increment
函数生成正确的代码。但它不知道
increment
函数是什么样子,因为它只看到.hpp文件,
increment
的代码在.cpp文件中


因此,使其工作的唯一方法是将声明和代码放在.hpp文件中,以便每次使用它时,您都有定义,编译器可以为您使用的类型生成正确的版本。

因此,与其在cpp文件中执行所有操作,不如在头中执行定义和实现?这有助于精简k将“成员函数定义”定义为“成员函数定义模板”。它们不是函数;它们是生成函数的模式,所以不要单独编译。@PeteBecker好的,这更有意义。因此,与其在cpp文件中执行所有操作,不如在头文件中执行定义和实现?这有助于思考“成员函数定义”作为“成员函数定义模板”"。它们不是函数;它们是生成函数的模式,所以不要单独编译。@PeteBecker好的,这更有意义。这是一个很好的解释,但我要说的是关于代码组织。我见过的一种实践是将头拆分为单独的文件——一个以.h结尾,另一个以.h结尾h.hpp.h文件将声明接口,然后在末尾包含.hpp文件。这在声明和定义之间提供了明确的分离。我认为从头文件中包含.cpp文件可能会令人困惑,因为通常认为.cpp文件是一个完整的翻译单元,但让它包含一个模板定义,它实际上不是。这是一个很好的解释,但我要说的是关于代码组织的更多。我见过的一个这样的实践是将头拆分为单独的文件——一个以.h结尾,另一个以.hpp结尾。该.h文件将声明接口,然后将
#包含// some other .cpp file
#include "increment.hpp"
...
  increment(a);