expected initializer before '<' token
我用的是codeblocks// expected initializer before '<' token 下面这句编译出错了,不知道为什么? // 定义类型别名 typedef std::vector<typename T::value_type> VecType;//这道题是要传进迭代器,T应该就会实例化成为迭代器类型,为什么还可以这样子使用T::value_type呢?//迭代器里面也有value_type这个定义,value_type不是在容器里面的吗?》#include <iostream>#include <memory>#include <string>#include <algorithm>//using namespace std;template <typename T >typename T::value_type MostFreq( T first, T last ){ // 计算需分配内存的大小 std::size_t amount = 0; T start = first; while ( start != last ) { amount++; start++; } // 定义类型别名 typedef std::vector<typename T::value_type> VecType; // 创建vector对象,用于保存输入序列的副本 VecType vec(amount); VecType::iterator newFirst = vec.begin(); VecType::iterator newLast = vec.end(); // 将输入序列复制到vector对象 std::uninitialized_copy( first, last, newFirst ); std::sort ( newFirst, newLast ); // 对副本序列排序,使得相同的值出现在相邻位置 std::size_t maxOccu = 0, occu = 0; // 出现最频繁的次数,当前值的出现次数 VecType::iterator preIter = newFirst; //指向当前值的前一个值 VecType::iterator maxOccuElement = newFirst; // 指向当前出现最频繁的值 while( newFirst != newLast ) { if ( *newFirst != *preIter ) // 当前值与前一值不同 { if ( occu > maxOccu ) // 当前值的出现次数为目前最大次数 { maxOccu = occu; // 修改最大次数 maxOccuElement = preIter; // 修改指向当前出现最频繁的值的迭代器 } occu = 0; } ++occu; preIter = newFirst; ++newFirst; } // 最后一个值的出现次数与目前的最大次数进行比较 if ( occu > maxOccu ) { maxOccu = occu; maxOccuElement = preIter; } return *maxOccuElement;}int main () { return 0;}
#include <iostream>#include <memory>#include <string>#include <algorithm>#include<vector>//using namespace std;template <typename T >typename T::value_type MostFreq( T first, T last ){ // 计算需分配内存的大小 std::size_t amount = 0; T start = first; while ( start != last ) { amount++; start++; } // 定义类型别名 typedef std::vector<typename T::value_type> VecType; // 创建vector对象,用于保存输入序列的副本 VecType vec(amount); typename VecType::iterator newFirst = vec.begin(); typename VecType::iterator newLast = vec.end(); // 将输入序列复制到vector对象 std::uninitialized_copy( first, last, newFirst ); std::sort ( newFirst, newLast ); // 对副本序列排序,使得相同的值出现在相邻位置 std::size_t maxOccu = 0, occu = 0; // 出现最频繁的次数,当前值的出现次数 typename VecType::iterator preIter = newFirst; //指向当前值的前一个值 typename VecType::iterator maxOccuElement = newFirst; // 指向当前出现最频繁的值 while( newFirst != newLast ) { if ( *newFirst != *preIter ) // 当前值与前一值不同 { if ( occu > maxOccu ) // 当前值的出现次数为目前最大次数 { maxOccu = occu; // 修改最大次数 maxOccuElement = preIter; // 修改指向当前出现最频繁的值的迭代器 } occu = 0; } ++occu; preIter = newFirst; ++newFirst; } // 最后一个值的出现次数与目前的最大次数进行比较 if ( occu > maxOccu ) { maxOccu = occu; maxOccuElement = preIter; } return *maxOccuElement;}int main () { return 0;}
[解决办法]
typename VecType::iterator newFirst = vec.begin();
typename VecType::iterator newLast = vec.end();
typename VecType::iterator preIter = newFirst; //指向当前值的前一个值
typename VecType::iterator maxOccuElement = newFirst;
------解决方案--------------------
template <class Category, class T, class Distance = ptrdiff_t,
class Pointer = T*, class Reference = T&>
struct iterator {
typedef T value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
typedef Category iterator_category;
};