2017-03-23 8 views
0

私の大学の宿題としてC++で独自の "ベクトル"クラスを実行する必要があります私はテンプレートに苦労しています。ld:アーキテクチャx86_64でシンボルが見つかりませんでした。clang:エラー:リンカーコマンドが終了コード1で失敗しました(呼び出すには-vを使用します)

すべての変数の型を型テンプレート 'typename T'に変更すると、このエラーが発生します。コンパイラは "friend"関数として宣言されている関数を指しているだけです。つまり、コンパイラのメッセージから見て(事業者== 'と '< <'):アーキテクチャx86_64版のため

未定義のシンボル: "演算子==(ベクトルconstの&、ベクタCONST &)"、から参照: _main main.oで _main LD:記号(S)アーキテクチャx86_64の 打ち鳴らすが見つかりません:エラーから参照main.o "オペレータ< <(STD :: __ 1 :: basic_ostream> &、ベクトル)"、中:リンカーコマンドが終了コード1で失敗しました(呼び出しには-vを使用してください)

ここでは、ヘッダーファイル内の2つのフレンド演算子関数の宣言とその実装について説明します。私はあなたの助けを本当に感謝して、私はこのエラーを取得する理由を私は理解していない

#include <iostream> 
#include "vector.hpp" 
#include "vector.cpp" 
using namespace std; 

int main(){ 

    Vector<double> second(10); 
    Vector<double> third {1.0, 2.0, 3.0, 4.0, 5.0}; 
    cout << third << endl; 

    Vector<double> v(10); 
    Vector<double> k(10); 

    if(k == v){ 
    cout << "YES" << endl; 
} 
    else{ 
    cout << "NO" << endl; 
} 

    return 0; 
} 

:私はちょうどこの二つの演算子をテストしたmain()関数で

friend ostream& operator <<(ostream& out, Vector<T> x); 
friend bool operator == (const Vector<T> &lop, const Vector<T> &rop); 

template <typename T> 
bool operator == (const Vector<T> &lop, const Vector<T> &rop){ 
    if(lop.size() != rop.size()){ 
return false; 
} 
else{ 
    int counter = 0; 
    for(int i = 0; i < lop.size(); i++){ 
     for(int j = 0; j < rop.size(); j++){ 
      if(lop.values[i] == rop.values[j]){ 
       counter++; 
      } 
     } 
if((counter == lop.size()) && (counter == rop.size())){ 
      return true; 
     } 
    } 
} 
return false; 

} 




template <typename T> 
ostream& operator <<(ostream& out, Vector<T> x) 
{ 
out << "["; 
for(int i = 0; i < x.size(); i++){ 
    out << x.values[i]; 
    if(i + 1 != x.size()){ 
     out << ", "; 
    } 
} 
out << "]"; 
return out; 
} 

+0

_ "とその実装" _この実装はどこですか? –

+0

これらの2つのシンボルは 'main()'で参照されます。あなたの 'main()'関数はどこにありますか? –

+0

@MartinZhai、ちょうど追加されました。 –

答えて

0

Vectorfriend宣言にtemplate <typename T>を追加する必要があります。

template <typename T> 
friend ostream& operator <<(ostream& out, Vector<T> x); 

template <typename T> 
friend bool operator == (const Vector<T> &lop, const Vector<T> &rop); 
+0

私はこれを前に試しましたが、コンパイラは次のように言っています: "Tの宣言はテンプレートパラメータ"をシャドウします –

+0

次に 'T'に別の名前をつけてみますか? –

+0

私はそれらを "friend"関数として宣言しているので、クラスVectorからのプライベート変数に "getter"関数を追加する必要はありません。私はゲッター機能をやめようとしていました。これらの2つの演算子関数のテンプレートの型名を変更すると、コンパイラは、関数の実装で使用した変数が "private"として宣言されていることを示します。 –

関連する問題