C++;模板类混淆 我是一个经验丰富的C程序员,最近我为编写一个玩具编译器而投入到C++中。我现在正在“现代化”我的C++代码,因为我的当前代码看起来更像ANSI-C,它唯一的C++优点是:STD::vector。

C++;模板类混淆 我是一个经验丰富的C程序员,最近我为编写一个玩具编译器而投入到C++中。我现在正在“现代化”我的C++代码,因为我的当前代码看起来更像ANSI-C,它唯一的C++优点是:STD::vector。,c++,templates,C++,Templates,所以我决定使用迭代器,而不是通过带有count变量的for循环手动迭代容器和数组。我注意到我需要经常访问几个迭代器的中间部分,所以我编写了一个静态类,其中包含一个函数 现在我扩展这个函数,不仅向中间元素返回迭代器,而且向容器的几个部分返回迭代器向量。我正在使用模板使代码更通用,但是我有点被当前函数的实现卡住了 以下是该类的定义: namespace dbc { template<typename generic_iterator_t> class itertools {

所以我决定使用迭代器,而不是通过带有count变量的for循环手动迭代容器和数组。我注意到我需要经常访问几个迭代器的中间部分,所以我编写了一个静态类,其中包含一个函数

现在我扩展这个函数,不仅向中间元素返回迭代器,而且向容器的几个部分返回迭代器向量。我正在使用模板使代码更通用,但是我有点被当前函数的实现卡住了

以下是该类的定义:

namespace dbc {
  template<typename generic_iterator_t>
  class itertools {
  public:
    /* returns an iterator which points to the middle element,
     * the same as calling get_fraction_iterator with fraction = 2 */
    static generic_iterator_t get_middle_iterator(
      generic_iterator_t begin, generic_iterator_t end
    );

    /* splits a container into several chunks and returns
     * the iterators in a vector */
    template<typename generic_iterator_t, size_t chunks>
    static std::vector<generic_iterator_t> get_chunk_iterator(
      generic_iterator_t begin, generic_iterator_t end
    );

    /* calculates the optimal chunk size, particulary useful
     * for get_chunk_iterator */
    template<typename generic_number_t>
    static constexpr generic_number_t
    get_optimal_chunk_size(generic_number_t val);
  };
}
名称空间dbc{
模板
类itertools{
公众:
/*返回指向中间元素的迭代器,
*与调用分数为2的get_fraction_迭代器相同*/
静态泛型迭代器\u t获取\u中间迭代器(
泛型迭代器\u t开始,泛型迭代器\u t结束
);
/*将容器拆分为多个块并返回
*向量中的迭代器*/
模板
静态std::vector get\u chunk\u迭代器(
泛型迭代器\u t开始,泛型迭代器\u t结束
);
/*计算最佳块大小,特别有用
*对于get\u chunk\u迭代器*/
模板
静态constexpr通用编号
获取最佳区块大小(通用编号值);
};
}
如何实现此功能? 据我所知,这应该是正确的,但事实并非如此

template<typename generic_iterator_t, size_t chunks>
static std::vector<generic_iterator_t>
dbc::itertools<generic_iterator_t>::get_chunk_iterator<
  generic_iterator_t, size_t
>(generic_iterator_t begin, generic_iterator_t end)
模板
静态std::vector
dbc::itertools::get\u chunk\u迭代器<
泛型迭代器,大小
>(泛型迭代器开始,泛型迭代器结束)
更改

template<typename generic_iterator_t, size_t chunks>
static std::vector<generic_iterator_t> get_chunk_iterator(
模板
静态std::vector get\u chunk\u迭代器(

模板
静态std::vector get\u chunk\u迭代器(

模板
静态std::vector
dbc::itertools::get\u chunk\u迭代器<
泛型迭代器,大小
>(泛型迭代器开始,泛型迭代器结束)

模板
模板
向量
dbc::itertools::get\u chunk\u迭代器(
泛型迭代器\u t开始,泛型迭代器\u t结束
){
返回{};
}
不需要在类和类的静态方法中重复类型
generic\u iterator\t


最后,使用模板类作为模板名称空间的方式很笨拙,可能不会产生太多的效果。

btw:dbc是名称空间您应该尝试添加更多的换行符以缩短行(它不是超级可读的)。此外,您对方法重复了
template
,而这不是必需的(编辑:我的意思是,这会起作用,但是类'
generic\u iterator\u t
将被方法的隐藏)。否则,由于您的类和方法都是模板,您需要两个模板参数列表:看到了吗,这似乎仍然不起作用,但这可能不是您的错,而是visual Studio的错。您使用的是哪种编译器?
template<size_t chunks>
static std::vector<generic_iterator_t> get_chunk_iterator(
template<typename generic_iterator_t, size_t chunks>
static std::vector<generic_iterator_t>
dbc::itertools<generic_iterator_t>::get_chunk_iterator<
  generic_iterator_t, size_t
>(generic_iterator_t begin, generic_iterator_t end)
template<typename generic_iterator_t>
template<size_t chunks> 
std::vector<generic_iterator_t> 
dbc::itertools<generic_iterator_t>::get_chunk_iterator(
  generic_iterator_t begin, generic_iterator_t end
){
  return {};
}