C ++中的operator函数和与之相关的编译错误

时间:2011-10-11 15:13:08

标签: c++ c compiler-errors operator-overloading operator-keyword

我可能会通过几种方式揭露这个问题的无知:)

首先,我认为这是C ++代码,但文件的扩展名是.C(所以可能是C?)

无论如何,我正在尝试编写一个名为Sundance(Sentence UNDerstanding ANd Concept Extraction)的程序,这是一个自然语言处理工具。我得到的编译错误与以下内容有关:

// This class is used internally to keep track of constituents that are
// potential subjects for clauses during clause handling.
class PotentialXP {
public:
  Constituent* XPPtr;
  unsigned int Distance;
  unsigned int ClauseIndex;
  unsigned int ConstIndex;

  PotentialXP() {
    XPPtr         = 0;
    Distance      = 0;
    ClauseIndex   = 0;
    ConstIndex    = 0;
  };

  operator int() const {
    return (int)XPPtr;  
  };

  void Set(Constituent* w,
           unsigned int x,
           unsigned int y,
       unsigned int z){
    XPPtr         = w;
    Distance      = x;
    ClauseIndex   = y;
    ConstIndex    = z;
  };
};

错误是“从'Constituent * const *'转换为'int'失去精度”

与行有关:

operator int() const {
  return (int)XPPtr;    
};

我明白为什么会收到错误。 XPPtr的类型为Constituent *,那么如何将其转换为整数?任何人都可以弄清楚代码的作者想要在这做什么,以及我如何重写这一行,以便它能够完成?什么是操作员功能(如果这就是你所说的)?

任何建议都非常感谢!

2 个答案:

答案 0 :(得分:1)

对我而言compiles fine。您使用的是64位计算机,其中size_t大于int

说明:您可以在历史上将指针转换为int

struct Foo {};

int main ()
{
    Foo * f = new Foo ();
    std :: cout << (int)f; // Prints 43252435 or whatever
}

如果您想要一个与指针大小相同的整数,请使用size_tssize_t

为什么你这样写operator int()呢?您想要operator bool()来测试有效性吗?在这种情况下,return NULL != XPPtr的函数体将是更好的样式 - 至少更清晰。

答案 1 :(得分:0)

operator int() const行说明了如何将对象投射到int

Constituent*可以转换为int,因为两种类型的大小通常相同。我不认为这是程序员想要的,因为原始指针值没有语义用途。也许应该有一个字段查找? E.g:

operator int() const {
  return (int)XPPtr->somevalue;    
};