Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++ 模板的重新定义<;T级>;在C++;_C++_Templates_Header_Redefinition - Fatal编程技术网

C++ 模板的重新定义<;T级>;在C++;

C++ 模板的重新定义<;T级>;在C++;,c++,templates,header,redefinition,C++,Templates,Header,Redefinition,我一直在寻找解决我问题的办法,但似乎找不到。我正在使用Code::Blocks,并且得到一个模板类的重新定义错误 这是我的“vectorax.h”文件: \ifndef vectoraux\u h #定义向量 #包括 #包括 #包括 模板 消除空洞(标准::矢量和v); 模板 无符号seqVectSearch(const std::vector&v,无符号优先, 未签名的最后一个,常量T和目标); 模板 void writeVector(const std::vector&v); #包括“vec

我一直在寻找解决我问题的办法,但似乎找不到。我正在使用Code::Blocks,并且得到一个模板类的重新定义错误

这是我的“vectorax.h”文件:

\ifndef vectoraux\u h
#定义向量
#包括
#包括
#包括
模板
消除空洞(标准::矢量和v);
模板
无符号seqVectSearch(const std::vector&v,无符号优先,
未签名的最后一个,常量T和目标);
模板
void writeVector(const std::vector&v);
#包括“vectorax.cpp”
#恩迪夫
这是我的“vectorAux.cpp”文件:

#包括“vectorAux.h”
#包括
#包括
#包括
模板
删除无效内容(标准::矢量和v)
{
std::矢量1;
无符号i,最后=v.size();

对于(int j=0;j来说,简单的答案是:模板不应拆分为源文件和头文件。在使用模板时,将其全部保存在头文件中。

您在vectorax.h中包含vectorax.cpp。我猜您也在单独编译vectorax.cpp。因此,您最终在vectorax.cpp中编译了两次代码

答案很简单,将代码从vectorax.cpp移动到vectorax.h,删除vectorax.cpp,您不需要它


模板代码几乎总是放在头文件中。

您的“vectorax.cpp”的内容应该在“vectorax.h”中因为您定义了一个模板类。

从项目源文件中删除模板类的.cpp。您当前正在编译.cpp文件两次;一次是因为它在项目中,另一次是因为.h包含它。另外,从.cpp中删除.h包含项,因为头是i,所以不需要它将.cpp包含在底部。这是分离模板类的不幸问题之一。

在编译
vectorax.cpp
文件的过程中会发生错误,因为您包含头文件,而头文件又包含实现文件。这样,您最终会得到cpp文件的内容已复制

如果您确实希望将模板函数的实现和声明拆分为两个单独的文件,那么您应该做两件事:

  • 不要在实现文件中包含headerfile
  • 不要将cpp文件添加到编译器正在翻译的文件中

  • 这两个选项中的任何一个都可以消除编译器错误,但您确实应该同时执行这两个操作。

    Code::Blocks不是编译器,而是IDE。它只显示编译器输出的错误。作为旁注:和。这并不能回答问题。一旦您有足够的编译器错误,您将能够;相反,.-这将解决问题lem.如果编译时在项目中有带模板类定义的.cpp,则会出现此错误。我不特别推荐使用此方法,但实际上这是一种非常常见的技术,将模板声明和定义拆分为两个单独的文件,然后像OP一样将实现文件包含到headerfile中。mistake还包括在cpp文件中包含headerfile和/或直接编译cpp文件。我不特别推荐它,但实际上它是一种非常常见的技术,将模板声明和定义拆分为两个单独的文件,然后像OP一样将实现文件包含到headerfile中。错误是还包括cpp文件中的headerfile和/或直接编译cpp文件。我同意第一段。但是,只要您显式实例化模板,就可以将模板声明和模板定义分开。有关详细信息,请查看此处
    #ifndef vectoraux_h
    #define vectoraux_h
    
    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    template <typename T>
    void removeDup(std::vector<T> & v);
    
    template <typename T>
    unsigned seqVectSearch(const std::vector<T> & v, unsigned first,
                   unsigned last, const T& target);
    
    template <typename T>
    void writeVector(const std::vector<T> & v);
    
    #include "vectorAux.cpp"
    #endif
    
    #include "vectorAux.h"
    
    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    template <typename T>
    void removeDup(std::vector<T> & v)
    {
        std::vector<int> vector1;
        unsigned i, last = v.size();
    
        for(int j = 0; j <= v.size(); j++)
        {
            std::cout << seqVectSearch(v, j, last, j);
            if(seqVectSearch(v, j, last, j) != v[i])
                vector1.push_back(seqVectSearch(v, j, last, j));
        }
    }
    
    template <typename T>
    unsigned seqVectSearch(const std::vector<T> & v, unsigned first,
                           unsigned last, const T& target)
    {
        unsigned i = first;
        while((v[i] != target) && (v[i] <= last))
        {
            if(v[i] == target)
                return i;
            i++;
        }
        return last;
    }
    
    template <typename T>
    void writeVector(const std::vector<T> & v)
    {
        unsigned i;
        unsigned n = v.size();
    
        for (i = 0; i < n; i++)
            std::cout << v[i] << ' ';
        std::cout << std::endl;
    }
    
    #include "vectorAux.h"
    #include <vector>
    #include <iostream>
    
    void fillVector(std::vector<int> & vect);
    
    int main()
    {
      using namespace std;
    
      vector<int> vect;
    
      fillVector(vect);
      cout << "Testing removeDup" << endl;
      cout << "Original vector is  ";
      writeVector(vect);
    
      removeDup(vect);
      cout << "Vector with duplicates removed is  ";
      writeVector(vect);
      cout << endl;
      writeVector(vect);
    
      return 0;
    }
    
    void fillVector(std::vector<int> & vect)
    {
      int arr[] = {1,7,2,7,9,1,2,8,9};
      unsigned arrsize = sizeof(arr)/sizeof(int);
    
      vect = std::vector<int>(arr, arr+arrsize);
    }