2016-09-23 7 views
-2

Я пытаюсь написать заявление FOPEN так:инвалидные операнды 'сопзЬ полукокса [8] Типы и 'Const символ *' в двоичную «оператор +

FILE *fp; 
fp = fopen("client." + receiver->get_identifier().c_str() + ".vol", "a+"); 

где receiver-> get_identifier() возвращает строка. Однако, я получаю ошибку в названии. Я прочитал вопрос here, но не имел никакой удачи, потому что первым аргументом fopen является const char *. Что мне нужно изменить, чтобы скомпилировать это?

+0

Dupe of [this] (http://stackoverflow.com/questions/23936246/error-invalid-operands-of-types-const-char-35-and-const-char-2-to-binar), но на самом деле просто опечатка. Избавьтесь от '.c_str' и оберните все это в(), а затем используйте' .c_str() '. – NathanOliver

ответ

3
receiver->get_identifier().c_str() 

возвращает const char*, не std::string, так operator+ не может умереть (один аргумент этого должен быть std::string). Удаление c_str() и преобразования в конце с std::string::c_str() должны сделать трюк

fopen(("client." + receiver->get_identifier() + ".vol").c_str(), "a+"); 

Это потому, что вы есть const char* плюс std::string и operator+ будет работать.

Если вы можете задаться вопросом, почему нельзя определить operator+ для const char*, это связано с тем, что C++ не позволяет перегрузку оператора для основных типов; по крайней мере один аргумент должен быть определенного пользователем типа.

2

Попробуйте изменить первый аргумент

(string("client.") + receiver->get_identifier() + ".vol").c_str() 

Это добавит std::string объекты с C-Style строк, which can be done, и только взять указатель на символ в конце (через .c_str()). Теперь ваш код пытается добавить строки C-Style, что невозможно.