This question already has answers here:
Where and why do I have to put the “template” and “typename” keywords?

(6个答案)


5年前关闭。




TL; DR:

函数的以下语法返回类型和return语句是什么意思? (来自 boost::interprocess 的代码)
template <class T>
typename segment_manager::template construct_proxy<T>::type
  construct(char_ptr_holder_t name)
  {   return mp_header->template construct<T>(name);  }



在尝试了解these lines中发生了什么时,我遇到了一些比较笨拙的语法:
//Create a new segment with given name and size
boost::interprocess::managed_shared_memory segment(boost::interprocess::create_only,
            "MySharedMemory", 65536);

//Initialize shared memory STL-compatible allocator
const ShmemAllocator allocator(segment.get_segment_manager());

ShmVector* v = segment.construct<ShmVector>("ShmVector")(allocator);

在最后一行中,调用了“重新运行“抛出”构造代理对象”(boost documentation)的函数。显然,它允许我们使用要传递给construct proxy的构造函数的参数(模板参数)来调用此ShmVector。由于找不到construct proxy的文档,因此我决定看一下并找到following code:
template <class T>
typename segment_manager::template construct_proxy<T>::type
  construct(char_ptr_holder_t name)
  {   return mp_header->template construct<T>(name);  }

在这里,我的理解停止了:
  • 看来函数构造有两种返回类型,typename segment_manager::templateconstruct_proxy<T>::type,这对我来说没有意义
  • template用作类成员(segment_managermp_header),这样禁止使用关键字吗?
  • 函数似乎实际上返回了两个对象/部分:
    语法return partA partB;暗示了这一点。
  • 最佳答案

    return mp_header->template construct<T>(name);
    

    关键字template用于指示construct*mp_header类型的成员模板。您可以将其想象为:
    return mp_header->construct<T>(name);
    

    实例化类型为constructT成员函数,以name作为参数调用它,然后返回结果。但是,由于template具有依赖类型,因此C++在这里需要使用mp_header关键字。另请:Where and why do I have to put the "template" and "typename" keywords?

    关于c++ - C++语法:return语句,在 “template”后带有空格;这是什么意思,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30519682/

    10-14 03:44