2015-01-01 75 views
3

當我嘗試使用命令C++錯誤:預期的類型說明符

g++ -o SLLtest SLLtester.cpp intSLList.o 

編譯這個簡單的鏈表的測試程序中,我收到錯誤:

SLLtester.cpp: In function ‘int main()’: 
SLLtester.cpp:4:27: error: expected type-specifier 
SLLtester.cpp:4:27: error: cannot convert ‘int*’ to ‘intSLList*’ in initialization 
SLLtester.cpp:4:27: error: expected ‘,’ or ‘;’ 

我失去了一些東西簡單,但我我不確定是什麼。頭文件和鏈接列表的定義編譯時沒有問題。這三個文件都包含在內。

//intSLList.hh 
#ifndef INT_LINKED_LIST 
#define INT_LINKED_LIST 

class intSLList { 
public: 
intSLList(){head=tail=0;} 
void Print(); 
void AddToHead(int); 
void AddToTail(int); 
int RemoveFromHead(); 
int RemoveFromTail(); 

protected: 
struct Node { 
    int info; 
    Node *next; 
    Node(int e1, Node *ptr = 0) {info = e1; next = ptr;} 
} *head, *tail, *tmp; 
int e1; 
}; 

#endif 

而且定義:

//intSLList.cpp 
#include "intSLList.hh" 
#include <iostream> 

void intSLList::AddToHead(int e1){ 
head = new Node(e1,head); 
if (!tail) 
    tail = head; 
} 

void intSLList::AddToTail(int e1){ 
if (tail) { 
    tail->next = new Node(e1); 
    tail = tail->next; 
} 
else 
    head = tail = new Node(e1); 
} 

int intSLList::RemoveFromHead(){ 
if (head){ 
    e1 = head->info; 
    tmp = head; 
    if (head == tail) 
    head = tail = 0; 
    else 
    head = head->next; 
delete tmp; 
return e1; 
} 
else 
    return 0;  
} 

int intSLList::RemoveFromTail(){ 
if (tail){ 
    e1 = tail->info; 
    if (head == tail){ 
    delete head; 
    head = tail = 0; 
    } 
    else { 
    for (tmp = head; tmp->next != tail; tmp = tmp->next); 
    delete tail; 
    tail = tmp; 
    tail->next = 0; 
    } 
    return e1; 
} 
else return 0; 
} 

void intSLList::Print(){ 
tmp = head; 
while(tmp != tail){ 
    std::cout << tmp->info << std::endl; 
    tmp = tmp->next; 
} 
} 

最後的主要功能:

#include "intSLList.hh" 

int main(){ 
intSLList* mylist = new intSLList::intSLList(); 
for (int i = 0; i < 10; i++){ 
    mylist->AddToTail(i);  
} 
mylist->Print(); 
} 

謝謝你的幫助。

+0

'intSLList * MYLIST =新intSLList();',但似乎沒有理由分配動態地,所以'intSLList mylist;' – juanchopanza

+0

這看起來不像_minimal_ testcase .... –

回答

3
intSLList* mylist = new intSLList::intSLList(); 

這是錯誤的。當我們編寫new intSLList()時,我們不是「調用構造函數」—僅僅命名—類型,因此完全命名構造函數(因爲intSLList::intSLList)是錯誤的。

所以:

intSLList* mylist = new intSLList(); 

你不需要反正這裏的動態分配:

#include "intSLList.hh" 

int main() 
{ 
    intSLList mylist; 

    for (int i = 0; i < 10; i++) { 
     mylist.AddToTail(i);  
    } 

    mylist.Print(); 
} 
1

你試圖調用構造函數作爲一個函數。構造函數會在您分配對象時自動調用,因此請更改爲

intSLList mylist; 

就是這樣,根本不需要指針或動態分配。