【问题标题】:Strange typenames and constructor in a template模板中奇怪的类型名和构造函数
【发布时间】:2012-10-22 00:26:48
【问题描述】:

我正在尝试理解 C++ 中的模板类。首先,我想了解一下这条线是什么意思:

template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> >
class matrix

其中 columns 和 allocator 分别是一个结构和一个定义在别处的类(命名空间 abc 中的第二个)。令我困扰的是它似乎有一个已经初始化的类型名。这是什么意思?当我想使用这个模板时,我是否也应该初始化 Ord 和 All 的类型名?

此外,还有这个唯一的构造函数:

explicit matrix(unsigned int rows = 0, unsigned int cols = 0, T init = T())

但它似乎已经被初始化了。 init 应该是什么意思?

我向您保证,我查看了所有代码,但没有什么可以帮助您更好地理解。感谢您的关注。

编辑:谢谢大家的回答。稍微放心(我是 C++ 的菜鸟):

int const& operator() operator()(unsigned int i, unsigned int j) const

这个方法意味着,当我们初始化类 foo 时,我们可以通过 foo()(1,2) 调用它,其中 i=1 和 j=2。我对吗?而这两个“const”指的是什么?

再次感谢您!

【问题讨论】:

    标签: c++ class templates explicit typename


    【解决方案1】:
    template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> >
    class matrix
    { 
        //...
    };
    

    这些是默认模板参数,它们就像默认函数参数一样工作 - 你可以指定它们,但如果你不这样做,它们就是默认的。

    你可以看到一个使用函数默认参数的例子。


    底线 - 以下所有行都是正确的:

    matrix<int> a; // matrix<int, columns, abc::allocator<int, 16> >
    matrix<int, rows> b; // matrix<int, rows, abc::allocator<int, 16> >
    matrix<int, columns, abc::other_allocator<int, 32> > c; // obvious
    
    matrix<int> a = matrix<int>(); // constructor called with 0, 0 and 
    // int() - default constructed T - in this case, int -  as arguments
    matrix<int> a(1, 2); // constructor called with 1, 2 and int() as arguments
    matrix<int> a(1, 2, 100); // obvious
    

    【讨论】:

      【解决方案2】:

      这意味着该类的用户已经设置了一个合理的默认值——例如,你可以提供一个,但你没有必须提供。构造函数参数也是如此。至于论据是什么意思,只有你自己能回答。

      【讨论】:

      • 感谢您的回答。但是, T() (仅在那里定义)似乎 init 应该是一个空的“东西”。我说的对吗?
      • @Pippo 表达式 T() 返回一个类型为 T 的值初始化对象——数值类型为零,类类型返回一个默认构造的对象。
      • 如果它有一个默认的构造函数。否则,它将初始化每个成员
      【解决方案3】:

      这是一个默认值。如果没有指定模板参数,它将采用默认值。
      就像你在函数中有默认值一样:

      void blah(int a = 0) { }
      

      【讨论】:

        【解决方案4】:

        如您所知,C++ 函数参数可以具有默认值,如果用户不提供该参数,则 C++ 编译器会为其使用该默认值。 现在在构造函数init 有一个默认值T() 这意味着使用其默认构造函数的类型的值,例如如果T=int 然后T() 意味着0 并且如果它是一个std::string 它是一个空细绳。您甚至可以将此语法用于其他参数:

        explicit matrix(
            unsigned int rows = unsigned int(),
            unsigned int cols = unsigned int(),
            T init = T());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-05
          • 1970-01-01
          • 1970-01-01
          • 2016-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-10
          相关资源
          最近更新 更多