模板有作用域或类似的东西吗?

Do templates have scope or scope like thing

本文关键字:作用域      更新时间:2023-10-16

我尝试创建一个类模板array,将接受接受任意边界,如50到60,100到200

我是新的编程,我有一个外行的问题,模板是否有范围。我试着编译

下面的程序
#include <iostream>
#include <vector>
#include <exception>
using namespace std;
template<typename t>
class array
{
private:
    size_t size;
    int lowerbound, upperbound;
    vector<t> data;
public:
    array(int , int );
    array(const array<t> &);
    int operator [](int );
};
template<typename t>
array<t>::array(int lbound, int rbound): 
    lowerbound(lbound), upperbound(rbound), size(upperbound - lowerbound + 1), data(size)
{
}
array<t>::array(const array<t> & c): 
    lowerbound(c.lowerbound), upperbound(c.upperbound), size(c.size)
{
    data.reserve(size);
}
int array<t>::operator[](int index)
{
    if (index < lowerbound || index > upperbound)cout << "fuck" << endl;
    else
        return data[index - lowerbound];
}

在复制构造函数array<T>::array(const array <T> &C)中,它说

t是未声明的…

我想既然一开始就声明了template <typename t>,就不需要再添加template<typename t>

这是我的问题

  1. 模板有作用域吗

  2. 如果是这样,在类作用域外定义类模板的成员函数时,我们必须声明这么多template <typename t>定义,或者是否有更好的替代

  3. 这可能与模板无关;如何在运行时指定向量或数组的大小,如c99中的可变长度数组(VLAs)。例如v.reseve(n),其中n在运行时已知。

  1. template<typename t>更像是一个类或函数的属性,而不是一个通用声明。从这个意义上说,是的,作用域是紧跟其后的函数或类。不,据我所知没有更好的选择了。你必须重复template<typename t>
  2. 就像处理固定长度数组一样:

    int length = someFunction();
    double myNumbers[length];
    myNumbers[0] = 3.3;