2013-04-02 40 views
0

我很難理解爲什麼下面的代碼不能在Visual Studio 2012下編譯,錯誤已經嵌入在下面的代碼中。 我覺得它與引用堆棧對象有關,但不太確定。 有人可以幫忙嗎?引用堆棧對象的地址

由於

#include <iostream> 

typedef struct Node { 
    Node *next; 
} Node; 

void test(Node *&p) { 
    p=p->next; 
} 

void main() { 
    Node *p1=new Node(); 
    test(p1); // this line compiles okay 

    Node p={0}; 
    test(&p); // error C2664: 'test' : cannot convert parameter 1 from 'Node *' to 'Node *&' 
} 
+0

的gcc爲您提供了一個很好的診斷:*「錯誤:類型‘節點*’的非const引用無效初始化從類型節點的」右值*」 *和回答您的懷疑勝任。 –

+0

哈哈。它的deja-vu又一次。= P。海灣合作委員會的錯誤是儘可能具體的,你可以得到。函數期望對左值的引用。你傳遞一個右值。可以這麼說,那裏沒有「那裏」。 – WhozCraig

回答

2

&p不是Node*類型的變量。這是一個Node*類型的常量。

即使您可以以某種方式參考p並將其傳遞給test()p=p->next;仍然會失敗,因爲您無法指定常量。

+0

+1對抗原因不明的downvote –

+0

@ Cheersandhth.-Alf謝謝!我剛開始想知道什麼是錯的。 –

+0

我猜想,當他拉動觸發器時,倒向選民正在考慮有關「r值」的短語。 – WhozCraig

1

您正在通過地址傳遞變量,而不是通過引用傳遞給變量的指針。我認爲這會工作:

void main() { 
    Node *p1=new Node(); 
    test(p1); 

    Node p={0}; 
    Node* p2 = &p; 
    test(p2);  
}