Перегрузка оператора шаблона C ++ - PullRequest
0 голосов
/ 20 марта 2012

Я получаю ошибку компиляции

"преобразование из '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)
}

Ответы [ 2 ]

1 голос
/ 20 марта 2012

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

foo<int> f = &x;

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

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

0 голосов
/ 20 марта 2012

Это решает вашу ошибку компиляции; Что касается того, что он делает, что вы хотите, он печатает ноль, поэтому я бы предположил, что это да.

#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);
}
...