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



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

int main()
{
    string * p = new string;
    memset(p, 0, sizeof(string));
    expected_exepath(p);
    cout << p->data;
    delete p;
}

错误出现在p->数据中,它表示"绑定到函数的指针只能用于调用函数"。。p是std::string,所以我不明白为什么它认为我正在尝试调用一个函数。

因为数据是函数,而不是数据成员。更重要的是,std::string的一半意义在于它是一个值。除非有充分的理由——在堆栈上进行分配,或者必须使用容器或智能指针进行动态分配,否则不应该使用new

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

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

几点:

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

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

  • p->data()传递给cout是危险的,因为与string::c_str()不同,data()返回的是没有null终止符的char数组。我建议你只用

    cout << *p;
    

    相反

如果expected_exepath采用std::string*参数,那么我建议重新编写如下函数:

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

string::data()是一个函数,而不是数据成员。你需要调用它,而不仅仅是取消引用它。比如:

cout << p->data();

我想提供另一个可能的错误,虽然与您的特定问题无关,但会导致相同的错误消息。

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

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

相关内容

  • 没有找到相关文章

最新更新