операторная функция в C ++ и связанная с ней ошибка компиляции - PullRequest
1 голос
/ 11 октября 2011

, вероятно, есть несколько способов, которыми я могу разоблачить свое невежество этим вопросом:)

Во-первых, я думаю, что это код 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 ]

1 голос
/ 11 октября 2011

То, что компилируется отлично для меня.Вы находитесь на 64-битной машине, где size_t больше int.

Объяснение: вы можете исторически преобразовать указатель в int

struct Foo {};

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

Если вам нужно целое числокоторый равен размеру указателя, используйте size_t или ssize_t.

И с какой стати вы все равно пишете operator int()?Вы хотите operator bool() проверить на достоверность?В этом случае тело функции return NULL != XPPtr будет более подходящим по стилю, по крайней мере, более ясным.

0 голосов
/ 11 октября 2011

В строке operator int() const указано, как ваш объект может быть приведен к int.

. Constituent* может быть приведен к int, потому что оба типа обычно имеют одинаковый размер.Я не думаю, что это то, что задумал программист, поскольку необработанное значение указателя не имеет смысла.Может быть, должен быть поиск поля?Например:

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