указатель, привязанный к функции, может использоваться только для вызова функции - PullRequest
1 голос
/ 02 августа 2011

Я только что перешел из массивов символов в 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, поэтому я не понимаю, почему он думает, что ' я пытаюсь вызвать функцию.

Ответы [ 4 ]

7 голосов
/ 02 августа 2011

Поскольку данные - это функция , а не элемент данных.Что еще более важно, половина смысла std::string в том, что это значение.Вы не должны использовать new, если у вас нет очень веских причин - выделять в стеке или если вам необходимо динамически распределять, используйте контейнер или умный указатель.

Также: никогда, никогда, никогда не устанавливайте memsetUDT, как это.Они постоянно заботятся о своем внутреннем состоянии и не связываются с ним.

6 голосов
/ 02 августа 2011

Ошибка в p-> data, которая говорит, что «указатель, связанный с функцией, может использоваться только для вызова функции» .. p это std :: string, поэтому я не понимаю, почемудумает, что я пытаюсь вызвать функцию.

Несколько моментов:

  • string::data() - это функция, поэтому это сообщение об ошибке вполне уместно.

  • p - это указатель на std::string, а не std::string.

  • Passing *От 1023 * до cout было бы опасно, учитывая, что data() возвращает массив символов без нулевого терминатора, в отличие от string::c_str().Я бы посоветовал вам просто использовать

    cout << *p;
    

    ... вместо этого.

Если expected_exepath принимает аргумент std::string*, я бы предложил переписать вашу функцию следующим образом:

int main()
{
    string p;    
    expected_exepath(&p); 
    cout << p;
}
1 голос
/ 02 августа 2011
cout << p->data;

string::data() - это функция, а не элемент данных. Вы должны называть это, а не просто разыменовывать это. Как это:

cout << p->data();
0 голосов
/ 11 августа 2018

Я хотел бы указать еще одну возможную ошибку, которая вызывает то же сообщение об ошибке, но не относится к вашему конкретному вопросу.

Это когда вы используете vector.emplace_back{.. , ..} вместо vector.emplace_back(.. , ..).

Надеюсь, что кто-то, допустивший эту ошибку, вроде меня, не запутается часами.

...