代码之家  ›  专栏  ›  技术社区  ›  Clèm

如果返回类型是C++中的对象,函数定义中是否可以有绝对命名空间?

  •  2
  • Clèm  · 技术社区  · 6 年前

    让我们考虑一个函数 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() . 当返回类型为对象时,如何在函数定义中使用绝对命名空间?

    2 回复  |  直到 6 年前
        1
  •  7
  •   T.C. Yksisarvinen    6 年前
    ::std::vector< float > (::foo::bar)()
    {
        // stuff
    }
    
        2
  •  7
  •   R Sahu    6 年前

    解决此问题的一种方法是使用尾随返回类型。

    auto ::foo::bar() -> ::std::vector< float >
    {
        ...
    }