У меня есть следующий код:
boost::filesystem::path p = boost::filesystem::current_path();
Но я получаю эту ошибку от g ++:
filesystem.cc: In function ‘int main(int, char**)’:
filesystem.cc:11: error: no matching function for call to ‘current_path()’
/usr/include/boost/filesystem/operations.hpp:769: note: candidates are: void boost::filesystem::current_path(const boost::filesystem::path&)
/usr/include/boost/filesystem/operations.hpp:771: note: void boost::filesystem::current_path(const boost::filesystem::wpath&)
В /usr/include/boost/filesystem/operations.hpp у меня есть следующее:
template< class Path >
Path current_path()
{
typename Path::external_string_type ph;
system::error_code ec( detail::get_current_path_api( ph ) );
if ( ec )
boost::throw_exception( basic_filesystem_error<Path>(
"boost::filesystem::current_path", ec ) );
return Path( Path::traits_type::to_internal( ph ) );
}
Так что функция есть. Я использую его так же, как примеры в документации Boost. Есть что-то глупое, что я здесь скучаю? Если я создаю путь с помощью «.», Это работает, но я хочу полное имя пути, а не просто «.».
У меня g ++ 4.4.6 на RedHat enterprise 6.2, с надстройкой 1.41.0 (я знаю, что она старая, но у меня нет возможности ее обновить).
Глядя на определение current_path
…
template< class Path > Path current_path() ...
current_path
это шаблон функции, и тип аргумента шаблона не может быть выведен из его параметров (которых нет ни одного) — поэтому мы должны явно предоставить аргумент шаблона.current_path()
имеет тот же тип, что и аргумент шаблона.Причина этого в том, что мы можем возвращать узкие и широкие пути символов, т.е.
namespace fs = boost::filesystem;
// get the current path
fs::path p = fs::current_path<fs::path>();
// get the current path in wide characters
fs::wpath wp = fs::current_path<fs::wpath>();
wpath
это широкоформатная версия path
(сродни wstring
а также string
).
Других решений пока нет …