Рассмотрим функцию bar, объявленную в пространстве имен foo, которая возвращает std::vector< float > (но также работает с другими объектами).
// header.h
#include <vector>
namespace foo
{
::std::vector< float > bar();
}
Компиляция его определения с использованием относительного пространства имен работает.
#include "header.h"
::std::vector< float > foo::bar()
{
}
Однако компиляция его определения с использованием абсолютного пространства имен не работает.
#include "header.h"
::std::vector< float > ::foo::bar()
{
}
Ошибка возврата из GCC равна
function.cpp:3:26: error: ‘foo’ in ‘class std::vector<float>’ does not name a type
::std::vector< float > ::foo::bar()
Получается что пробелы допускаются в пространстве имен, поэтому ::std::vector< float > ::foo::bar() эквивалентно ::std::vector< float >::foo::bar(). Как использовать абсолютное пространство имен в определении функции, когда тип возвращаемого объекта является объектом?
Один из способов решения проблемы - использовать возвращаемый тип возврата.
auto ::foo::bar() -> ::std::vector< float >
{
...
}