绑定到函数的指针只能用于调用函数

时间:2011-08-01 23:16:09

标签: c++ pointers stdstring

我刚刚从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,所以我不明白为什么它认为我我试图打电话给一个功能。

4 个答案:

答案 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(.. , ..)的时候。

希望也许像我这样犯错误的人几个小时都不会感到困惑。