Strange typenames and constructor in a template
我正在尝试理解C++中的模板类。首先,我想了解这一行的含义:
1 2 | template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> > class matrix |
其中,列和分配器分别是在别处定义的结构和类(命名空间abc中的第二个)。令我困扰的是,它似乎有一个已经初始化的类型名。这是什么意思?当我想使用这个模板时,我还应该初始化ORD和ALL的类型名吗?
此外,还有一个唯一的构造函数:
1 | explicit matrix(unsigned int rows = 0, unsigned int cols = 0, T init = T()) |
但它似乎已经初始化了。init是什么意思?
我向您保证我看过所有代码,但是没有什么能帮助您更好地理解。谢谢你的关注。
编辑:谢谢大家的回答。只是一个小小的安慰(我是C++中的NoOB):
1 | int const& operator() operator()(unsigned int i, unsigned int j) const |
这个方法意味着,当初始化类foo时,我们可以通过foo()(1,2)调用它,其中i=1,j=2。我说的对吗?这两个"警察"是什么意思?
再次感谢!
1 2 3 4 5 | template <typename T, typename Ord = columns, typename All = abc::allocator<T,16> > class matrix { //... }; |
这些是默认的模板参数,它们就像默认的函数参数一样工作——您可以指定它们,但是如果不指定,它们将是默认的。
您可以看到一个使用函数默认参数的例子。
底线-以下所有行都是正确的:
1 2 3 4 5 6 7 8 | 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 |
这意味着类的用户已经设置了一个合理的默认值——如中所述,您可以提供一个默认值,但您不必这样做。构造函数参数也是如此。至于这些论点的含义,只有你能回答。
正如C++中所知道的,函数参数可以有默认值,如果用户不提供这些参数,那么C++编译器就为它们使用默认值。现在在构造函数中,
1 2 3 4 | explicit matrix( unsigned int rows = unsigned int(), unsigned int cols = unsigned int(), T init = T()); |
它是默认值。如果没有指定template参数,它将采用默认值。就像函数中有默认值一样:
1 | void blah(int a = 0) { } |