0

未知のアイテムタイプのベクトルを取り込む関数を作成する必要があります。これが私のコードです:

template <typename S>
void printVector(vector<S*> c){
   typename vector<S>::const_iterator A = c.begin();
   for (int A; A != c.end(); A++){
       cout<<c[A]<<" ";
   }
   cout<<endl;
}

私のメインクラスには、ベクトルと関数の呼び出しがあります。

vector<int> x;
int j=5;
for(int i=0;i<j;i++){
    x.push_back(num[i]);
}
printVector(x);

このコードをコンパイルしようとすると、次のエラーが発生します。

Exercise1_1.cpp:関数'int main()':
exercise1_1.cpp:33:15:エラー:'<code> printVector(std :: vector <int>&)'<br>exercise1_1の呼び出しに一致する関数がありません。 cpp:33:15:注:候補は:
exercise1_1.cpp:13:7:注:template<class S> void printVector(std::vector<S*>)

4

2 に答える 2

3

コードにいくつかのエラーがありました。それらを見てみましょう:

  • のシグニチャではprintVector、タイプが。のパラメータを取りますvector<S*>。これは、与えられたタイプに対して、Sへのポインタのベクトルを取ることを意味しますS。したがって、たとえば、タイプがint、の場合は、「送信」する必要がありますvector<int*>。あなたの例では、「送信」しようとしているvector<int>ので、の署名は次のprintVectorようになります。

    template <typename S>
    void printVector(vector<S> c)
    
  • forループでは、変数Aをとして再度宣言していますint。C ++標準ライブラリでは、イテレータを使用するか、配列のようにそれらにアクセスするだけで、ベクトル内のすべてのアイテムにアクセスできます。あなたは両方のものを混ぜていました。

イテレータを使用してループする場合は、次のようになります。

typename vector<S>::const_iterator a = c.begin();
for (; a != c.end(); a++){
    cout<<*a<<" ";
}

つまり、ベクトル内のすべてのアイテムについて、その値を出力します(*aイテレーターを使用しているため、使用したことに注意してください)。

または、インデックスベースのアプローチを使用します。

for (int i = 0; i < c.size(); i++){
   cout<<c[i]<<" ";
}

また、C ++コミュニティでの一般的な方法として、非プリミティブ型の変数を受け取る場合はconst参照を使用します。これにより、オブジェクトのコピーが実行されなくなるため、膨大なコレクションを処理する場合におそらく高速になります。例:

 void printVector(const vector<S>& c)

完全に機能する例を次に示します。

#include <vector>
#include <iostream>

using namespace std;

template <typename S>
void printVector(const vector<S>& c){
   for (int i = 0; i < c.size(); i++){
       cout<<c[i]<<" ";
   }
   cout<<endl;
}

int main(int argc, char** args) {
    vector<int> x;
    int j=5;
    for(int i=0;i<j;i++){
        x.push_back(i);
    }
    printVector<int>(x); // Can be printVector(x); too
    return 0;
}
于 2012-11-08T23:12:02.253 に答える
2
template <typename S>
void  printVector(const std::vector<S>& c){
   typename std::vector<S>::const_iterator A = c.begin();
   for (; A != c.end(); A++){
       std::cout<<*A<<" ";
   }
   std::cout<<"\n";
}

修正:

  • あなたの関数は取るように宣言されましたvector<S*>が、あなたは明らかにそれが取るようにしたいのですvector<S>
    • メイン関数は、引数を使用してprint_vectorを呼び出しましたstd::vector<int>intS*どのタイプにも対応していないためS、テンプレートは適用されませんでした。
  • A最初の宣言のみを使用する場合は、再宣言しました。
  • ベクターへのインデックス付きアクセスとイテレータを介したアクセスを組み合わせました。
    • intがある場合:c[i]
    • イテレータがある場合:*it

重要度の低い修正:

  • 避けるusing namespace std;
  • std::endl意味するときは絶対に使用しないでください"\n"
  • パラメータは、値ではなくconst参照で渡す必要があります
于 2012-11-08T23:02:44.607 に答える