构造函数参数列表中的模板参数无效

时间:2018-03-04 00:50:12

标签: c++

晚上好,我正在尝试创建一个模板化的类,它将有两个const_iterators成员指向向量的子部分的开头和结尾。我想让类通用,以便我可以将它用于任何类型的矢量。

我的类定义在ThreadWorker.h文件中,如下所示:

template <typename T>
class VectorWorker
{
public:
    VectorWorker<T>() = default;
    VectorWorker<T>( std::vector<typename T>::const_iterator begin,  std::vector<typename T>::const_iterator end);
    void Work() const;

private:
    std::vector<typename T>::const_iterator beginIt; /* Stores value of left iterator that defines data for this worker */
    std::vector<typename T>::const_iterator endIt; /* Stores value of right iterator that defines data for this worker */
};

当我尝试编译我的代码时,我收到一条错误,指出模板参数无效:

error: template argument 1 is invalid
     VectorWorker<T>( std::vector<typename T>::const_iterator begin,  std::vector<typename T>::const_iterator end);

我不太明白为什么我收到此错误,因为我通过“typename”关键字指定T是typename模板参数。任何人都可以帮助解释这里发生了什么,或者指向一个好的资源?感谢。

1 个答案:

答案 0 :(得分:1)

尝试移动typename参数列表之外的template

template<typename T>
class VectorWorker {
private:
    typename std::vector<T>::const_iterator beginIt;
    typename std::vector<T>::const_iterator endIt;
public:
    VectorWorker<T>() = default;
    VectorWorker<T>( typename std::vector<T>::const_iterator begin, typename std::vector<T>::const_iterator end ) :
        beginIt( begin ),
        endIt( end ) 
    {}    
};

您之前拥有的成员和构造函数参数

std::vector<typename T>::const_iterator beginIt; 
std::vector<typename T>::const_iterator endIt;

std::vector<typename T>::const_iterator begin;
std::vector<typename T>::const_iterator end;

不是Types

要解决此问题,成员的模板参数列表以及构造函数参数只需要模板类型<T>

要使const_iterator成为一种类型,您需要将其声明为typename

typename std::vector<T>::const_iterator name;