2013-07-21 2 views
1

Я смотрю на использование подталкивания :: сериализации и пытаюсь использовать строку помощник на данную http://www.ocoudert.com, который имеет интерфейсссылки на константный символ *, ошибка C2664:

SerializeCStringHelper(char*& s) : s_(s) {} 
SerializeCStringHelper(const char*& s) : s_(const_cast<char*&>(s)) {} 

Я пытаюсь использовать это помощник в следующем коде (GetName() возвращает зЬй :: строки)

bool MyUtilities::saveSerialLibraryToFile(const string& fileName, const MyLibrary& lib) 
{ 
    bool saved = false; 
    ofstream out(fileName, ios::app); 
    if(out.is_open()) 
    { 
     boost::archive::text_oarchive ar(out); 
     const char* str = lib.getName().c_str(); 
     SerializeCStringHelper helper(str); 
//  SerializeCStringHelper helper(lib.getName().c_str()); 
     ar & helper; 
     saved=true; 
    } 
    return saved; 
} 

который компилирует хорошо, но теперь, если я заменить константные символ * StR и вспомогательные линии с закомментированным кодом, я получаю ошибку компиляции C2664: невозможно преобразовать параметр 1 из 'const char *' в 'char * & '

Вопрос в том, почему единственная линия, отличная от двух отдельных линий?

ответ

2

SerializeCStringHelper helper(lib.getName().c_str());

Эта линия пытается передать временное конструктору SerializeCStringHelper проблемы вы не можете связать с временным неконстантной ссылкой. Вот почему SerializeCStringHelper helper(str); работает, потому что str не является временным объектом.

Пример:

#include <string> 

void foo(const char*& str) {} 

void bar(const char* const & str) {} 

int main() 
{ 
    std::string s("..."); 
    //foo(s.c_str()); 
    bar(s.c_str()); 

    return 0; 
} 

Этот код будет компилироваться, потому что бар принимает константную ссылку, но если вы раскомментировать вызов Foo, он не будет компилироваться, потому что Foo принимает неконстантную ссылку.

+0

Блестящий, спасибо –

+1

Если ответ был полезен, вы можете его принять;) – Borgleader