我刚刚从char数组转移到std :: string而且我已经遇到了问题,我可能正在做一些非常愚蠢的事情,随意嘲笑:
int main()
{
string * p = new string;
memset(p, 0, sizeof(string));
expected_exepath(p);
cout << p->data;
delete p;
}
错误在p-&gt;数据中,表示“绑定到函数的指针只能用于调用函数”.p是std :: string,所以我不明白为什么它认为我我试图打电话给一个功能。
答案 0 :(得分:7)
因为数据是函数,而不是数据成员。更重要的是,std::string
的一半是它的价值。您不应该使用new
,除非您有非常好的理由 - 在堆栈上分配,或者您必须动态分配使用容器或智能指针。
另外:永远不要忘记这样的UDT。他们一直照顾自己的内部状态,不要惹它。
答案 1 :(得分:6)
错误在p-&gt;数据中,表示“绑定到函数的指针可能 只用于调用函数“.. p是std :: string,所以我没看到 为什么它认为我试图调用一个函数。
几点:
string::data()
是一个函数,因此该错误消息是完全合适的。
p
是指向std::string
的指针,而不是std::string
。
将p->data()
传递给cout
会很危险,因为data()
返回没有空终结符的char数组,与string::c_str()
不同。我建议你只使用
cout << *p;
...来代替。
如果expected_exepath
采用std::string*
参数,那么我建议您重写这样的函数:
int main()
{
string p;
expected_exepath(&p);
cout << p;
}
答案 2 :(得分:1)
cout << p->data;
string::data()
是一个函数,而不是数据成员。你需要调用它,而不仅仅是取消引用它。像这样:
cout << p->data();
答案 3 :(得分:0)
我想提供另一个可能的错误,尽管与您的特定问题无关,但它会导致相同的错误消息。
这是您使用vector.emplace_back{.. , ..}
而不是vector.emplace_back(.. , ..)
的时候。
希望也许像我这样犯错误的人几个小时都不会感到困惑。