C++ 语法:在“模板”之后带有空格的 return 语句;这是啥意思[重复]
Posted
技术标签:
【中文标题】C++ 语法:在“模板”之后带有空格的 return 语句;这是啥意思[重复]【英文标题】:C++ Syntax: return statement with space after "template"; what does it mean [duplicate]C++ 语法:在“模板”之后带有空格的 return 语句;这是什么意思[重复] 【发布时间】:2015-05-29 01:26:51 【问题描述】:TL;DR:
以下函数返回类型和返回语句的语法是什么意思? (代码来自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)的函数。显然,它允许我们使用将传递给ShmVector
(模板参数)的构造函数的参数来调用这个construct proxy
。由于我找不到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::template
和 construct_proxy<T>::type
,这对我来说没有意义
template
被用作类成员(segment_manager
、mp_header
),这样使用关键字不是不允许吗?
这些函数似乎实际上返回了两个对象/部分:
语法 return partA partB;
建议这样做。
【问题讨论】:
当你意识到整个事情可以写成:return mp_header -> template construct < T > ( name ) ;
时,它变得(稍微)不那么混乱了。也就是说,首先,空格在很大程度上是不相关的。只是,由于“模板”和“构造”都是完全由字母组成的,因此您需要 将它们分开,而其余部分则不需要。但它仍然是一个单一的表达式。
【参考方案1】:
return mp_header->template construct<T>(name);
关键字template
用于表示construct
是*mp_header
类型的成员模板。你可以把它想象成:
return mp_header->construct<T>(name);
它用T
类型实例化construct
成员函数,用name
作为参数调用它,然后返回结果。但是,C++ 在这里需要 template
关键字,因为 mp_header
具有依赖类型。见:Where and why do I have to put the "template" and "typename" keywords?
【讨论】:
以上是关于C++ 语法:在“模板”之后带有空格的 return 语句;这是啥意思[重复]的主要内容,如果未能解决你的问题,请参考以下文章