很长一段时间后我才恢复使用C ++。我在Macbook Pro上使用Eclipse,我尝试只创建一个链接列表的小项目。
当我尝试编译项目时,我遇到了这个错误:
ld: symbol(s) not found for architecture x86_64
仅当我在main.cpp中#include "SingleLinkedList.h"
并执行与SingleLinkedist
相关的操作时才会发生这种情况,否则在main中删除上面的SingleLinkedList,项目会编译罚款。我一直在寻找类似的问题同样的错误,但似乎没有一个帮助我解决这个问题。
如果需要,这是类文件:
据我所知,之前的所有内容都以相同的方式用于在Eclipse上正常工作。我刚刚回升到Lion,并安装了新的Xcode和新的Eclispe,现在面临着奇怪的问题,而不是专注于编码。
SingleLinkedList.cpp
#include "SingleLinkedList.h"
template<class T>
SingleLinkedList<T>::~SingleLinkedList()
{
Node<T> *temp = head;
while(head!=0)
{
temp = head;
head = temp->next;
delete temp;
}
}
template <class T>
void SingleLinkedList<T>::addToHead(int item)
{
head = new Node<T>(item, head);
if (tail==0)
tail = head;
}
template <class T>
void SingleLinkedList<T>::addToTail(int item)
{
if(tail!=0)
{
tail->next = new Node<T>(item);
tail = tail->next;
}
else
head = tail = new Node<T>(item);
}
template <class T>
int SingleLinkedList<T>::deletefromHead()
{
int e1 = head->info;
Node<T> *temp = head;
if(head ==tail)
{
head = tail = 0;
}
else
head = temp->next;
delete temp;
return e1;
}
template <class T>
int SingleLinkedList<T>::deletefromTail()
{
int e1 = tail->info;
if(head == tail)
{
delete head;
head = tail = 0;
}
else{
Node<T> *temp = head;
while(temp->next != tail)
temp = temp->next;
delete tail;
tail = temp;
tail->next = 0;
}
return e1;
}
template <class T>
void SingleLinkedList<T>::deleteNode(int item)
{
if(head!=0) {
if(head == tail && head->info){ //If this is the only item in the linked list
delete head;
head = tail = 0;
}
else if (item == head->info){
Node<T> *temp = head;
head = temp->next;
delete temp;
}
else{
Node<T> *temp = head;
while(temp->next->info != item && temp->next !=0 ){
temp = temp->next;
}
if(temp!=0){
temp->next = temp->next->next;
temp = temp->next;
delete temp;
}
}
}
}
template <class T>
bool SingleLinkedList<T>::isEmpty()
{
return head == 0;
}
template <class T>
bool SingleLinkedList<T>::isInList(int item)const
{
Node<T> * temp = head;
while(temp!=0)
{
if(temp->info == item){
break;
}
temp = temp->next;
}
return temp->info == item;
}
template<class T>
SingleLinkedList<T>::SingleLinkedList()
{
head = tail = 0;
}
SingleLinkedList.h
#include "Node.h"
#ifndef SINGLELINKEDLIST_H_
#define SINGLELINKEDLIST_H_
template <class T>
class SingleLinkedList {
public:
SingleLinkedList();
~SingleLinkedList();
bool isEmpty();
bool isInList(int)const;
void addToHead(int);
void addToTail(int);
int deletefromHead();
int deletefromTail();
void deleteNode(int);
private:
Node<T> *head;
Node<T> *tail;
};
#endif /* SINGLELINKEDLIST_H_ */
的main.cpp
#include <iostream>
#include "SingleLinkedList.h"
using namespace std;
int main() {
SingleLinkedList<int> listfile;
listfile.addToHead(2);
listfile.addToHead(4);
listfile.addToHead(6);
listfile.addToHead(8);
listfile.addToHead(10);
return 0;
}
答案 0 :(得分:2)
实际上,这不起作用的原因是因为你没有为模板类定义头文件,而是单独实现,因为模板没有编译器生成的实现。所以拥有.cpp文件是不正确的c ++。将它全部内联或仅保留在标题中。 see the following at the very bottom
答案 1 :(得分:0)
您需要确保它们位于构建路径中,以便eclipse知道将.cpp文件链接到二进制文件的其余部分。转到项目 - &gt;属性 - &gt; c ++ general - &gt;路径和符号 - &gt;源位置,你应该能够从那里设置它。再次构建时,请确保通过查看构建日志来构建包含该实现的.cpp文件。
如果您不包含整个构建日志,那么添加源代码并没有多大帮助。