【问题标题】:C++ template operator overloadingC++ 模板运算符重载
【发布时间】:2012-03-19 23:35:57
【问题描述】:

我收到编译错误

“请求从'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)
}

【问题讨论】:

  • @KerrekSB 以缩进开头
  • 抱歉打字失败,纠正使用不一致的ptr错误。

标签: c++ templates overloading operator-keyword


【解决方案1】:

指出的问题是变量f与其初始化器之间的类型不匹配:

foo<int> f = &x;

变量的类型为foo&lt;int&gt;,而初始值设定项的类型为int*,而foo&lt;int&gt; 没有将int* 作为参数的构造函数。请注意,变量定义中的等号表示初始化,而不是赋值。

但请注意,代码存在更多问题。其中许多与 ptr 标识符的不一致使用(有时作为成员变量,有时作为函数,有时作为类型)、&amp; 的无效使用以及更多类型不匹配错误有关。

【讨论】:

  • 但是操作符重载函数不应该解决这个问题吗? ptr& operator =(const T &point) "&x" 确实是 (const T &) 那么为什么编译器不接受这个重载呢?
  • 您没有分配给该行上的变量。你正在初始化它。
  • 啊,谢谢,我没有意识到这一点。我也没有意识到我在重新输入代码时失败了。我会修正打字错误。
【解决方案2】:

这解决了你的编译错误;至于它是否做你想做的事,它打印为零,所以我认为这是肯定的。

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

【讨论】:

  • 谢谢,我正要编辑我的帖子以包含固定代码,然后你发布了这个。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2023-03-03
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
相关资源
最近更新 更多