2011-04-07 17 views
9

我看到像* unspecified *在C++ typedef语句中指的是什么?

的typedef声明*不明* VALUE_TYPE;

typedef * unspecified * reference;

在声明Boost :: multi_array类。

namespace boost { 

template <typename ValueType, 
      std::size_t NumDims, 
      typename Allocator = std::allocator<ValueType> > 
class multi_array { 
public: 
// types: 
    typedef ValueType        element; 
    typedef *unspecified*       value_type; 
    typedef *unspecified*       reference; 
    typedef *unspecified*       const_reference; 
    typedef *unspecified*       difference_type; 
    typedef *unspecified*       iterator; 
    typedef *unspecified*       const_iterator; 
    typedef *unspecified*       reverse_iterator; 
    typedef *unspecified*       const_reverse_iterator; 
    typedef multi_array_types::size_type   size_type; 
    typedef multi_array_types::index    index; 
    typedef multi_array_types::index_gen   index_gen; 
    typedef multi_array_types::index_range  index_range; 
    typedef multi_array_types::extent_gen   extent_gen; 
    typedef multi_array_types::extent_range  extent_range; 
    typedef *unspecified*       storage_order_type; 

* * * * * * * * * * * * * * * * * * * * * * * * * * * *这是一个C++ 11标准吗?

+6

这是从文档复制而不是编译头文件?这对我来说看起来并不像是有效的C++,但看起来像是试图告诉你typedef存在的文档,而不告诉你将来可能会改变的基础类型的真实名称。 – Stewart 2011-04-07 12:14:49

+0

你从哪里看到它的? – 2011-04-07 12:16:10

+0

只是要模仿斯图尔特的评论:如果你打开multy_array.hpp,你不会找到任何“*未指定*”的标记。有参考依赖于teplate参数的基类。 – Eugene 2011-04-07 12:33:26

回答

13

我假设这是在文档中,而不是编译代码,因为它是不可编译的。

这样做通常表明typedef可供使用,但其别名的类型取决于实现并且不被视为公共接口的一部分。

在这种情况下,上述的可编译头文件包含沿的线的声明:其中别名类型以基类中定义

typedef typename super_type::value_type value_type; 

。挖掘更深入,反过来又来自另一个基类,实际的类型深深地埋藏在实现细节中,不同的定义取决于数组有多少个维度;对于一维阵列,此特定类型为ValueType,对于较高维度为multi_array<ValueType,NumDims-1>

1

不。它意味着一个特定的实现可能会将其定义为任何想要的。这是在规范中 - 而不是实际可编译的C++。

2

我刚打开multi_array.hpp标题,(如预期),它没有这样的类型定义,但它看起来像这样:

template<typename T, std::size_t NumDims,typename Allocator> 
    class multi_array : 
     public multi_array_ref<T,NumDims> 
    { 
     typedef multi_array_ref<T,NumDims> super_type; 
    public: 
     typedef typename super_type::value_type value_type; 
     typedef typename super_type::reference reference; 
     typedef typename super_type::const_reference const_reference; 
     typedef typename super_type::iterator iterator; 
     typedef typename super_type::const_iterator const_iterator; 
     typedef typename super_type::reverse_iterator reverse_iterator; 
     typedef typename super_type::const_reverse_iterator const_reverse_iterator; 
     typedef typename super_type::element element; 
     typedef typename super_type::size_type size_type; 
     typedef typename super_type::difference_type difference_type; 
     typedef typename super_type::index index; 
     typedef typename super_type::extent_range extent_range; 
    // ... 

如果您正在阅读的reference pages for boost::multi_array,那么就意味着你应该使用typedef,而不是你自己的类型。我想在编写模板类时应该真正使用这些typedefs。

9

看起来好像是从this documentation复制的。 *unspecified*只是意味着它与你完全无关,而且它是一个实现细节。不要再深入了解它,只是承认,typedef在那里。

0

unspecified是在boost :: units :: detail命名空间中定义的空结构。

它被用作父类中的占位符返回类型(思想继承),利用它可以在任何将来派生类中重载并具有适当返回类型的事实。 在泛型编程中可能有其他几种用法。 当我找到更多的例子时,我将继续在这里添加。

相关问题