当前位置: 首页 > 知识库问答 >
问题:

template类中函数的模板参数

虞修平
2023-03-14

我有这样的情况

template<class T> class Vector {
  T *data;
  uint _size, _counter;
public:
  class Iterator;
  template<template<class> class C> Vector(typename C<T>::Iterator it1,
                                           typename C<T>::Iterator it2) {
    data = NULL;
    _size = _counter = 0;
    for(typename C<T>::Iterator it = it1; it != it2 && it != end(); it++)
      push(*it);
  }
};

这是我自己的Vector类,构造函数模拟了Vector的行为(u可以通过使用interator提供的数据范围来构造它),但增加了一个要求,即容器是与正在构造的容器相同类型的模板。我有错误

5.cpp:16:36:错误:调用“Vector::Vector(Vector::Iterator,Vector::Iterator)”没有匹配函数5.cpp:16:36:注意:候选项是:包含在5.cpp:2:0:

5.HPP:17:37:注意:模板类typedef C C>Vector::Vector(typename C::Iterator,typename C::Iterator)

5.HPP:17:37:注意:模板参数推演/替换失败:

5.cpp:16:36:注意:无法导出包含在5.cpp:2:0中的文件中的模板参数“template class typedef C C”:

5.HPP:11:3:注:vector::vector()[其中T=int]

5.HPP:11:3:注意:候选人需要0个参数,提供2个

5.HPP:7:25:注:vector::vector(常量vector&)

5.HPP:7:25:注:候选人需要1个参数,提供2个

这里需要帮助。

共有1个答案

柳涵意
2023-03-14

在:

 template<template<class> class C> Vector(typename C<T>::Iterator it1,
                                           typename C<T>::Iterator it2) 

编译器不会从typenameC ::iterator 导出类型C,因为它是所谓的非导出上下文。

参见§14.8.2.4从类型[temp.defint.type]推导模板参数:

4未推导的上下文是:

-使用限定ID指定的类型的nested-name-specifier。

-是模板ID的类型,其中一个或多个模板参数是引用模板参数的表达式。

 类似资料:
  • voidsmarty_function_name(array $params, object &$smarty) All attributes passed to template functions from the template are contained in the$params as an associative array. Either access those values d

  • 如果我没有理解错的话,类模板定义了一个函数,所以当我调用时,编译器有可能进行隐式强制转换,但是在函数模板的情况下,此时没有函数定义,所以隐式强制转换不会发生。 但我不明白为什么编译器不能创建函数定义,然后应用隐式强制转换? 错误是: 在函数“int main()”中:    25:24:错误:调用“test2::add(void(&)(int))”没有匹配函数    25:24:注:候选人是:  

  • 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty

  • 我想知道如果函数的模板参数包括但不限于类的模板参数,如何使函数成为类的朋友并在类外定义函数。 例如,我有以下模板类和模板朋友函数: 如果我编译: 我会得到以下链接器错误:

  • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译

  • 我想定义一个特征,它告诉一个复杂的表示形式是否是一个结构数组,其中的实际值从来不是AoS,因此不需要用户定义的指定,但对于复杂的表示形式,您总是需要一个: 专门化是通过从std::true/false_type派生而以std方式完成的。 问题是:使用这个实现,我会得到“template argument invidents template parameter”错误(在链接的问题中解释了这一点),