我可能会通过几种方式揭露这个问题的无知:)
首先,我认为这是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 *,那么如何将其转换为整数?任何人都可以弄清楚代码的作者想要在这做什么,以及我如何重写这一行,以便它能够完成?什么是操作员功能(如果这就是你所说的)?
任何建议都非常感谢!
答案 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_t
或ssize_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;
};