Ошибка при получении символьного указателя `boost :: filesystem :: path` - PullRequest
1 голос
/ 08 июля 2019

Из двух следующих строк: первая выдает ошибку времени компиляции, вторая в порядке:

    std::remove( boost::filesystem::path( mypath / "file.log" ).c_str() );
    std::remove( boost::filesystem::path( mypath / "file.log" ).string().c_str() );

Подпись std::remove: int remove( const char* fname );

Thisэто сообщение об ошибке:

"Ни один экземпляр перегруженной функции" std :: remove "не соответствует списку аргументов"

Но оба boost::filesystem::path::c_str() и std::string::c_str() возвращаютa const char*.

Я использую компилятор Visual C ++ 2013.

1 Ответ

3 голосов
/ 08 июля 2019

Но оба boost :: filesystem :: path :: c_str () и std :: string :: c_str () вернуть константный символ *

нет, это не так.

Мы можем открыть boost\filesystem\path.hpp исходный код и посмотреть, что там происходит:

  template< typename Char, Char Separator, Char PreferredSeparator, Char Dot >
  struct path_constants
  {
    typedef path_constants< Char, Separator, PreferredSeparator, Dot > path_constants_base;
    typedef Char                                    value_type; // <---
    //...
  };

  class path :
    public filesystem::path_detail::path_constants<
#ifdef BOOST_WINDOWS_API
      wchar_t, L'/', L'\\', L'.'  // [1]
#else
      char, '/', '/', '.'
#endif
    >
  {

и в [1] строка wchar_t передается в качестве первого аргумента Char в шаблон path_constants, поэтому в Windows c_str возвращает указатель на широкий символ (2 байта).

...