7

問題の解決策を検索して検索しましたが、見つけられないようです。Code::Blocks を使用していますが、テンプレート クラスの再定義エラーが発生します。

ここに私の「vectorAux.h」ファイルがあります:

#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

ここに私の「vectorAux.cpp」ファイルがあります:

#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;
}

このプログラムの最終的なファイルは「vectorDriver.cpp」ですが、これにはエラーはありません。これは、関数を呼び出してプログラムを実行するだけです:

#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);
}

与えられたすべてのヘルプ/アドバイスに本当に感謝します! しばらく調べてみたところ、見つかった各ソースはヘッダーファイルを保護するように言っていますが、すでにそれを行っており、問題はまだ続いています.

4

5 に答える 5

5

vectorAux.h に vectorAux.cpp を含めます。vectorAux.cpp も個別にコンパイルしていると思います。したがって、vectorAux.cpp のコードを 2 回コンパイルすることになります。

答えは簡単です。コードを vectorAux.cpp から vectorAux.h に移動し、vectorAux.cpp を削除します。必要ありません。

テンプレート コードは、ほとんどの場合、ヘッダー ファイルに含まれます。

于 2012-10-23T07:16:11.267 に答える
3

テンプレートクラスを定義するため、「VectorAux.cpp」の内容は「VectorAux.h」内にある必要があります。

于 2012-10-23T07:16:32.700 に答える
0

ファイルのコンパイル中にエラーが発生しvectorAux.cppます。これは、ヘッダー ファイルをインクルードしているためです。ヘッダー ファイルには実装ファイルが含まれています。このようにして、cpp ファイルの内容が複製されてしまいます。

テンプレート関数の実装と宣言を 2 つの別個のファイルに分割したい場合は、次の 2 つのことを行う必要があります。

  1. 実装ファイルにヘッダーファイルを含めないでください。
  2. コンパイラによって変換されるファイルに cpp ファイルを追加しないでください。

これら 2 つのオプションのいずれかを使用すると、コンパイラ エラーが解消されますが、実際には両方を実行する必要があります。

于 2016-05-15T20:13:35.133 に答える