2011-05-03 86 views
0

當我試圖插入這個'食物'對象到我的模板類鏈接列表'測試'。我得到這個錯誤:模板類鏈接列表插入錯誤

request for member ‘addNode’ in ‘test’, which is of non-class type ‘Catalog<FoodSource>() 

這是我的編碼,我做錯了什麼?

##main:## 

int main(void) 
{ 
    Catalog<FoodSource> test(); 
    FoodSource food(); 
    test.addNode(const &food); 
    return(0); 
} 

##function definition in .h:## 

template<class T> 
class Catalog 
{ 
    public: 
     void addNode(const T& value); 
}; 

##function implementation in .cpp:## 

template <class T> 
void Catalog<T>::addNode(const T& value) 
{ 
    Node *temp; 

    if(head == NULL) 
     head = new Node (value, NULL); 
    else 
    { 
     temp=head; 

     while(temp->next !=NULL) 
      temp=temp->next; 

     temp->next = new Node (value, NULL); 
    } 
} 

回答

4

您剛發現C++語法中存在的許多疣中的一個。該標準要求,如果表達式既可以被解釋爲聲明又可以被解釋爲定義,那麼它必須被視爲聲明。例如你的代碼

Catalog<FoodSource> test(); 

沒有定義一個名爲test變量而是宣稱有一個功能名爲test,它沒有參數和返回Catalog<FoodSource>實例。

要定義變量,您需要省略括號。

注意,存在以下情況:這個陷阱更難看到...例如:

double x = 3.14159; 
int y(int(x)); 

爲驚人的它可能看起來在上面的代碼yis declared as a function

+1

aka [最令人頭疼的解析](http://en.wikipedia.org/wiki/Most_vexing_parse)。 – 2011-05-03 07:06:38

+0

感謝您的鏈接。有效的STL正是我瞭解這個可怕的陷阱的地方......我決定永遠不會浪費時間編寫C++解析器。 – 6502 2011-05-03 08:49:46

0

聲明和實施類模板應該是in the same file

此外,您可以撥打main致電test.addNode(food);

+0

.h文件包含在.cpp中。調用test.addNode(食物);給我同樣的錯誤。 – 2011-05-03 06:56:04

+0

@邁克爾:有了模板,這是不夠的。編譯器在實例化時需要完整的模板定義(在'main'中就是這種情況)。 – 2011-05-03 07:07:30

0

所有類節點鑑於定義,FoodSource等是可用的,你至少需要做到以下幾點:

1)將函數定義.h文件中

2)第一行中主要功能是ambigous。它應該被重寫爲Catalog<FoodSource> test;,因爲Catalog<FoodSource> test()將被視爲函數原型