2012-03-19 6 views
-2

Я получаю ошибку компиляцииC++ шаблон оператор перегрузки

«преобразование из„INT *“для нескалярный типа„Foo < межд>“просил»

Что я делаю неправильно?

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

Где начать ... –

+0

Я согласен с Kerrek :) – Robinson

+0

@KerrekSB начать с отступом –

ответ

1

Проблема по линии, обозначенной в том, что у вас есть несоответствие типов между переменной f и его инициализаторе:

foo<int> f = &x; 

переменная имеет тип foo<int> в то время как инициализатор типа int* и foo<int> Безразлично» t имеет конструктор с аргументом int*. Обратите внимание, что знак равенства в определении переменной указывает на инициализацию, а не на присвоение.

Обратите внимание, что код имеет больше проблем. Многие из них связаны с непоследовательным использованием идентификатора ptr (иногда в качестве переменной-члена, иногда как функции, иногда как типа), для недопустимого использования & и других ошибок несоответствия типов.

+0

, но не должна ли функция перегрузки оператора позаботиться об этом? ptr & operator = (const T & point) «& x» действительно является (const T &), так почему же компилятор не забирает эту перегрузку? –

+0

Вы не назначаете переменную в этой строке. Вы его инициализируете. –

+0

А, спасибо, я этого не осознавал. Я также не понимал, что я так сильно не смог перепечатать код. Я исправлю ошибки ввода. –

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

спасибо человеку, я собирался отредактировать мое сообщение, чтобы включить фиксированный код, а затем вы разместили это. :) –

Смежные вопросы