C:Header文件中的模板正在摧毁我
我精通
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]; } } 我一直得到同样的错误:
有更多模板在同一文件中导致类似错误.我想如果我能修好一个,我会弄清楚如何解决剩下的问题.我已经尝试过每一件我能想到的事情. 非常感谢您的帮助.我在这里疯了.哈哈. 解决方法
在标头中,您需要提供名称空间.
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的优点.) #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) { ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |