C:Header文件中的模板正在摧毁我

C:Header文件中的模板正在摧毁我,第1张

概述我精通 Java,但对C来说很新.我完全不理解什么是错的. 这是代码: // Sort_Search.h#ifndef SORT_SEARCH_H#define SORT_SEARCH_H using std::vector;template<typename T> void printVector(vector<T> &list);#endif// Sort_Searc 我精通 Java,但对C来说很新.我完全不理解什么是错的.

这是代码:

// Sort_Search.h#ifndef SORT_SEARCH_H#define SORT_SEARCH_H  using std::vector;template<typename T> voID printVector(vector<T> &List);#endif// Sort_Search.cpp#include <iostream>#include <vector>using std::vector;template<typename T>voID printVector(vector<T> &List) {    // print every member of the List    for(int i = 0; i < (int)List.size(); i++) {        // insert a comma where needed        if(i != 0)            cout << ",";        cout << List[i];    }}

我一直得到同样的错误:

sort_search.h(6): error C2182: ‘printVector’ : illegal use of type ‘voID’

sort_search.h(6): error C2998: ‘int printVector’ : cannot be a template deFinition

有更多模板在同一文件中导致类似错误.我想如果我能修好一个,我会弄清楚如何解决剩下的问题.我已经尝试过每一件我能想到的事情.

非常感谢您的帮助.我在这里疯了.哈哈.

解决方法 在标头中,您需要提供名称空间.

template<typename T> voID printVector(std::vector<T> List);//                                    ^^^^^

您需要考虑以下几点:

>在C中,如果不指定参数(数组除外),则它们始终作为值类型传递,与Java不同,Java中每个对象都作为引用类型传递.这意味着,如果函数签名是printVector(std :: vector< T> List),则在将Feed列入printVector时将复制该列表.这通常是不受欢迎的.因此,您需要通过添加&来更改它以通过引用传递.到类型:

template<typename T> voID printVector(std::vector<T>& List);//                                                  ^

但将其作为参考意味着将修改printVector中的列表.您通常不希望不小心修改列表.这可以通过使参数保持不变来强制执行:

template<typename T> voID printVector(const std::vector<T>& List);//                                    ^^^^^

(使其成为const-reference也具有可以接受rvalues的优点.)
>与Java不同,在C和c#include中不知道您之前是否包含过标题. #include只是一种“复制粘贴”机制.这意味着,如果编译器以某种方式看到

#include "Sort_Search.h"...#include "Sort_Search.h"

然后将定义2个printVector副本,这会导致编译器错误.如果两个不同的头文件a.h和b.h包含Sort_Search.h,而某些源文件包含a.h和b.h,则可以这样做.为避免这种情况,我们总是需要提供an #include guard,以防止文件被多次包含:

#ifndef SORT_SEARCH_H_m6f2kyhdncxflxr#define SORT_SEARCH_H_m6f2kyhdncxflxr//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^template<typename T> voID printVector(const std::vector<T>& List);#endif//^^^^

>矢量< T>不是内置类型,因此您需要#include< vector>让编译器知道这种类型的存在.

#ifndef SORT_SEARCH_H_m6f2kyhdncxflxr#define SORT_SEARCH_H_m6f2kyhdncxflxr#include <vector>//^^^^^^^^^^^^^^^template<typename T> voID printVector(const std::vector<T>& List);#endif

>最后,template的实现方式与Java或C#中的泛型不同.它就像一个AST级别的复制粘贴机制.每次调用printVector时,编译器都会确定T是什么(例如,int),然后通过将每个T替换为int来创建一个新函数.

因此,模板的实现不能与声明分开.或者,实施是声明的一部分.因此,为了正确,必须将printVector移动到标题中:

#ifndef SORT_SEARCH_H_m6f2kyhdncxflxr#define SORT_SEARCH_H_m6f2kyhdncxflxr#include <vector>#include <iostream>template<typename T> voID printVector(const std::vector<T>& List) {   for (int i = 0; i < List.size(); ++ i) { ... }}#endif

或者,如果您仍想将.cpp与.h分开,则可以包含.h中的.cpp:

#ifndef SORT_SEARCH_H_m6f2kyhdncxflxr#define SORT_SEARCH_H_m6f2kyhdncxflxr#include <vector>template<typename T> voID printVector(const std::vector<T>& List);#include "Sort_Search.cpp"//^^^^^^^^^^^^^^^^^^^^^^^^#endif
// Sort_Search.cpp:#include <iostream>template<typename T> voID printVector(const std::vector<T>& List) {    ...}
总结

以上是内存溢出为你收集整理的C:Header文件中的模板正在摧毁我全部内容,希望文章能够帮你解决C:Header文件中的模板正在摧毁我所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222363.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存