2016-05-30 8 views
0

こんにちは私は3つのファイルmain.cpp、My_Stack.cpp、My_Stack.hppをコンパイルしようとするとC++にいくつかの問題があります。私はヘッダーファイルを含めていないかのように、 "#include" My_Steak.hpp ""の代わりに "#include" My_Stack.cpp ""を追加するかのように、 "x86_64アーキテクチャの未定義シンボル"エラーがmain.cppで機能します良い。定義はMy_Stack.cppにヘッダファイルすなわち定義を対応する内側行かなければならないアーキテクチャの未定義シンボルx86_64 C++でエラーが発生しました。ヘッダがリンクされていません。


//main.cpp 
#include <iostream> 
#include "My_Stack.hpp" 

int main(int argc, const char * argv[]) { 
    My_Stack<int> s = My_Stack<int>(); 
    s.push(1); 
    s.push(2); 
    cout << s.pop() << endl; 
    cout << s.pop() << endl; 


} 

//My_Stack.hpp 
#ifndef My_Stack_hpp 
#define My_Stack_hpp 

#include <stdio.h> 

#include <string> 

using namespace std; 

template<class T> 
class My_Stack { 

public: 
    My_Stack(); 
    void push(T v); 
    T pop(); 

private: 
    class My_Stack_Node { 
    public: 
     T data; 
     My_Stack_Node* next; 
     My_Stack_Node(T n) { 
      data = n; 
      next = NULL; 
     } 
    }; 
    My_Stack_Node* head; 

}; 


#endif /* My_Stack_hpp */ 

//My_Stack.cpp 
#include "My_Stack.hpp" 

#include <string> 
#include <sstream> 

using namespace std; 

template<class T> 
My_Stack<T>::My_Stack() { 
    this->head = NULL; 
} 

template<class T> 
void My_Stack<T>::push(T v) { 
    if (this->head == NULL) { 
     this->head = new My_Stack_Node(v); 
    } 
    else { 
     My_Stack_Node* aux = new My_Stack_Node(v); 
     aux->next = this->head; 
     this->head = aux; 
    } 
} 

template<class T> 
T My_Stack<T>::pop() { 
    My_Stack_Node* aux = this->head; 
    this->head = this->head->next; 
    return aux->data; 
} 

答えて

0

テンプレートはMy_Stack.hppの内側に置かれなければなりません。

は、よくある質問の上に行くことをお勧め:
よくある質問から関連部分をペースト https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl


テンプレートはクラスまたは関数ではありません。テンプレートは、コンパイラがクラスのファミリを生成するために使用する " "パターンまたは 関数です。

コンパイラがコードを生成するためには、 は、テンプレート定義(宣言だけでなく)と の特定のタイプ/テンプレートの「埋め込み」の両方を参照する必要があります。 の例では、Fooを使用しようとする場合、コンパイラは Fooテンプレートと、 固有のFooを作成しようとしていることを確認する必要があります。

コンパイラは、別の.cppファイルをコンパイルしているうちに、ある種の.cppファイルの詳細を が覚えていない可能性があります。 これは可能ですが、ほとんどの場合、このFAQを読んでいる場合はほとんど は間違いありません。これを別々のコンパイル モデルといいます。

関連する問題