【问题标题】:a pointer bound to a function may only be used to call a function绑定到函数的指针只能用于调用函数
【发布时间】:2011-10-17 20:19:54
【问题描述】:

我刚刚从 char 数组转移到 std::string 并且已经遇到了问题,我可能正在做一些非常愚蠢的事情,请随意嘲笑:

int main()
{
    string * p = new string;
    memset(p, 0, sizeof(string));

    expected_exepath(p);

    cout << p->data;

    delete p;
}

错误在 p->data 中,它说“绑定到函数的指针只能用于调用函数”.. p 是 std::string,所以我不明白为什么它认为我'我试图调用一个函数。

【问题讨论】:

  • 什么是expected_exepath?调侃:就说int main() { string p; expected_exepath(p); cout &lt;&lt; p; }。您应该尝试从您的 C++ 思维模式中去掉 new 表达式。在客户端代码中几乎从不需要它或很有品味。
  • 可能是 expected_exepath 采用了 OP 试图填充的 char* 缓冲区。只是猜测......
  • 我是 C++ 新手,所以我只是在尝试,但感谢您的提示。 expected_exepath 采用 std::string *.
  • 为什么expected_exepath take std::string *`?听起来它应该只返回一个字符串,并且不带任何参数。

标签: c++ pointers stdstring


【解决方案1】:

错误在 p->data 中,它表示“绑定到函数的指针可能 只用于调用函数”.. p 是 std::string,所以我看不到 为什么它认为我在尝试调用一个函数。

几点:

  • string::data() 是一个函数,因此该错误消息是完全合适的。

  • p 是一个指针,指向std::string,而不是std::string

  • p-&gt;data() 传递给cout 会很危险,因为data() 返回一个没有空终止符的字符数组,这与string::c_str() 不同。我建议你只使用

    cout << *p;
    

    ...相反。

如果expected_exepath 接受std::string* 参数,那么我建议您像这样重写您的函数:

int main()
{
    string p;    
    expected_exepath(&p); 
    cout << p;
}

【讨论】:

    【解决方案2】:

    因为数据是一个函数,而不是数据成员。更重要的是,std::string 的一半是它的价值。你不应该使用new,除非你有一个非常好的理由——在堆栈上分配,或者如果你必须动态分配使用容器或智能指针。

    另外:永远不要像这样 memset UDT。他们一直在照顾自己的内部状态,并且不会乱来。

    【讨论】:

    • 我知道我并没有分配电子游戏或其他东西的整个地图,但我只是在尝试。我没有想;太习惯于 char 数组。
    【解决方案3】:
    cout << p->data;
    

    string::data() 是一个函数,而不是一个数据成员。您需要调用它,而不仅仅是取消引用它。像这样:

    cout << p->data();
    

    【讨论】:

    • 太好了,谢谢,我没有意识到这一点。也许我下次应该看看文档
    【解决方案4】:

    我想提供另一个可能导致相同错误消息的错误,但与您的具体问题无关。

    当您使用vector.emplace_back{.. , ..} 而不是vector.emplace_back(.. , ..) 时。

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

    【讨论】:

    • 我犯了同样的错误,我只花了 10 分钟就找到了你的答案。大 +1 :-)
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2012-12-16
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多