2011-12-06 15 views
0

私は間違って何をしているのかわかりません。これは私の初めての.cppファイルの分離とテンプレートとベクトルの使い方です。私はこれらの2つのエラーが発生し続ける:エラーC2143:構文エラー: '、'の前に '<'が見つかりません。注:C++コンパイラは、どのような種類を知っていないので、あなたがこれを行うには、明示的なインスタンス化を必要とするデフォルト-INTテンプレートとベクトルのエラー

main.cppに

#include <iostream> 
#include <vector> 
using namespace std; 

template <typename T> 
void write_vector(const vector<T>& V); 

int main() 
{ 
    int n; 
    int value; 
    vector<int> V; 
    cout << "Enter n: "; 
    cin >> n; 
    cout << "Enter " << n << " integer values: "; 
    while(V.size() < n && cin >> value){ 
     V.push_back(value); 
    } 

    write_vector(V); 

    return 0; 
} 

writeVector.cpp

template <typename T> 
void write_vector(const vector<T> &V) 
{ 
    for(int i=0; i < V.size(); i++) 
     cout << V[i] << " "; 
} 
+0

エラーの行は何ですか? –

+0

を#includeするか、関数を明示的にインスタンス化しますか?あなたの質問には詳細がありません。 –

+0

writeVector.cppはどこにインクルードしますか?テンプレートはオブジェクトファイルとは別にコンパイルできないため、最終的にmain.cppにインクルードする必要があります。どのラインでエラーが表示されますか? – dimba

答えて

3

をサポートしていません。テンプレートは、.cppをコンパイルするときにコンパイルする必要があります。 Explicit instantiation - when is it used?を参照してください。

+0

したがって、私の.hと.cppファイルはどのように見えますか? – Sean

0

両方のファイルにincludeusingが必要です。その時点で、他の回答に記載されている明示的なインスタンス化が必要な場合がありますが、それらはリンカの問題として表示されます。

1

私が覚えている限り、テンプレートの宣言と実装を分けることはできません。

3

テンプレート関数は、コンパイラが使用できるように事前に定義する必要があります。 main()の前に単一ファイルで定義するか、ヘッダファイルに#をインクルードします。

要約すると、テンプレート関数はヘッダーファイルで定義する必要があります。 Why can templates only be implemented in the header file?

+0

はメインの前に定義されたテンプレートではありませんか? – Sean

+0

コンパイラは、テンプレートタイプが存在することのみを認識します。定義をヘッダファイルに移動し、mainの前に#includeするか、mainの上にコピーする必要があります。 – koan

0

write_vectorは、異なるモジュール間で共有したい場合は.cppファイルではなく、ヘッダーファイル(writeVector.h)に入れる必要があります。これを行う必要がある理由の詳細については、C++ FAQを参照してください。

writeVector.cppにusing namespace std;がないために構文エラーが発生していると推測しますか?ヘッダーファイルに移動するときには、このファイルをインクルードするときに、グローバル名前空間を不必要に汚染するため、このディレクティブを使用しないでください。代わりに、vectorへのすべての参照をstd::vectorとして明示的に修飾する必要があります。あなたの上に

0

追加MAIN.CPP:あなたのVector.cpp

#include <vector> 
#include <iostream> 

template<class T> 
void write_vector(const std::vector<T>& V) 
{ 
    for(int i=0; i < V.size(); i++) 
     std::cout << V[i] << " "; 
} 

#include "Vector.cpp" // since you are learning, this is really strange and should be avoided, but for your example we leave it as is. 

をステートメントを使用して使用しないでください。悪癖。明示的なインスタンス化やその他のものは必要ありません。コンパイラは正しいテンプレートを差し引くことができます。

これはうまくいかず、悪いコードです。テンプレートを使用する場合は、常に.hファイル内のすべてを書き込みます。したがってVector.cppVector.hに変更してください。あなたのmain.cppから前方宣言を削除し、#include "Vector.cpp"

あなたのコードは他の変更なしでうまく動作します。

最後に、C++のやり方は、例えば、次のようになります。 :

#include <vector> 
#include <iostream> 
#include <algorithm> 

template<class T> 
void write_vector(const std::vector<T>& V) 
{ 
    std::copy(V.begin(), V.end(), std::ostream_iterator<T>(std::cout, " ")); // you don't even need this function right? 
    //for(int i=0; i < V.size(); i++) 
//  std::cout << V[i] << " "; 
} 

cinでも同様のことができます。

関連する問題