2016-05-30 59 views
0

嗨我遇到一些问题,当我尝试编译我的3个文件,main.cpp,My_Stack.cpp和My_Stack.hpp如果我没有包含头文件,并且在main.cpp中添加了“#include”My_Stack.cpp“”而不是“#include”My_Steak.hpp“”,那么“Undefined symbols for architecture x86_64”错误精细。未定义的符号体系结构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.cpp头文件即定义必须内My_Stack.hpp放。

推荐你去在常见问题解答:
https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl

从常见问题粘贴相关部分:

模板是不是一个类或函数。模板是编译器用来生成一系列类或函数的“模式” 。

为了让编译器生成代码 它必须同时看到模板定义(不仅仅是声明)和用于“填充”模板的特定类型。对于 示例,如果您尝试使用Foo,编译器必须同时看到 Foo模板以及您试图制作特定Foo的事实。

您的编译器在编译另一个.cpp文件时可能不记得一个.cpp文件的细节 。 它可以,但大多数不会,如果你正在阅读这个FAQ,它几乎没有 。顺便说一下,这被称为“单独编辑 模型。”

相关问题