2012-03-19 79 views
-2

我得到一個編譯錯誤C++模板操作符重載

「從‘詮釋*’轉換到非標量型‘富< int>的’要求」

我到底做錯了什麼?

template <typename T> 
struct foo { 
    T *ptr; 
    foo(void){} 
    foo<T>& operator =(const T &point) { 
    if (ptr != &point) { 
    ptr = &point; 
    } 
    return *this; 
    } 
    T& operator*() { 
    return *ptr; 
    } 
} 

int main(){ 
    int x;   
    foo<int> f = &x; //error here 
    *f = 0; 
    printf("%d\n", *f) 
} 
+3

從哪裏開始...... – 2012-03-19 23:38:08

+0

我Kerrek :) – Robinson 2012-03-19 23:43:41

+0

同意@KerrekSB縮進 – 2012-03-19 23:44:47

回答

1

上顯示線路的問題是,你有可變f和初始化之間的類型不匹配:

foo<int> f = &x; 

變量具有類型foo<int>而初始化是int*型和foo<int>沒有按」沒有一個構造函數以int*作爲參數。請注意,變量定義中的等號表示初始化,而不是賦值。

請注意,代碼有更多的問題,但。它們中的很多都與ptr標識符的使用不一致有關(有時作爲成員變量,有時作爲函數,有時作爲類型),以致無效使用&以及更多類型不匹配錯誤。

+0

但不應該運營商超載功能照顧呢? ptr &operator =(const T&point) 「&x」確實是一個(const T&),那麼爲什麼編譯器沒有拿起那個過載? – 2012-03-19 23:48:05

+0

你沒有分配給該行的變量。你正在初始化它。 – 2012-03-19 23:51:17

+0

啊,謝謝,我沒有意識到這一點。 我也沒有意識到我在重新輸入代碼方面失敗了。我會解決輸入錯誤。 – 2012-03-20 00:01:06

0

這可以解決您的編譯錯誤;至於它是否做你想要的,它打印零,所以我會認爲這是一個是的。

#include <stdio.h> 

template <typename T> 
struct foo { 
    T *ptr; 
    foo(void) {}; 
    foo(T* p) { ptr = p; }; 

    T*& operator =(const T &point) { 
    if (ptr != &point) { 
     ptr = &point; 
    } 
    return *this; 
    } 

    T& operator*() { 
    return *ptr; 
    } 
}; 

int main(){ 
    int x; 
    foo<int> f = &x; 
    *f = 0; 
    printf("%d\n", *f); 
} 
+0

謝謝你,我正要編輯我的帖子以包含固定代碼,然後你發佈了這個。 :) – 2012-03-20 00:07:20