2010-08-10 83 views
1

我希望能够创建一个函数,在该函数中指定一个参数以同时为该容器提供模板化容器和模板化元素类型。这可能吗?我收到“错误C2988:不可模仿的模板声明/定义”等等。这是有问题的功能。C++模板 - 指定容器类型和它容纳的容器元素类型

template<class Iter, class Elem> 
void readIntoP(Iter<Elem> aCont){ 
ifstream ifss("data.dat"); 
string aString; 
int counter = 0; 
item tempItem; 
while(ifss >> aString){ 
    istringstream iss(aString); 
    if(counter == 0){ 
     tempItem.name = aString; 
    }else if(counter == 1){ 
     int aNum = 0; 
     iss >> aNum; 
     tempItem.iid = aNum; 
    }else{ 
     double aNum = 0; 
     iss >> aNum; 
     tempItem.value = aNum; 
     aCont.push_back(tempItem); 
     counter = -1; 
    } 
    ++counter; 
    } 
} 
+0

重复排序-的[C++函数模板编译错误“‘containerType’不是一个模板” ](http://stackoverflow.com/questions/3436518/c-function-template-compiles-error-containertype-is-not-a-template)(解决方案至少是完全相同的)。 – 2010-08-11 00:03:03

回答

4

您将需要使用模板模板参数,例如,

template <template <class> class Iter, class Elem> 
void readIntoP(Iter<Elem> aCont) { /* ... */ } 

但是请注意,该标准库中的容器采取多种模板参数(vector,例如,有两个:一个是要存储的值类型和分配器要使用的值类型)。

您可能会改用一个模板参数的实例化的容器类型,然后使用它的value_type的typedef:

template <typename ContainerT> 
void readIntoP(ContainerT aCont) 
{ 
    typedef typename ContainerT::value_type ElementT; 
    // use ContainerT and ElementT 
} 
+0

参数化迭代器通常比容器更好。 (这是OP在做什么。) – Potatoswatter 2010-08-11 02:44:22

+0

@Patatoswatter:很难说。问题标题和变量名称意味着OP正试图传递一个容器; typename意味着OP正在尝试传递某种类型的迭代器。无论哪种方式,迭代器也有'value_type' typedef。我同意通常最好传递迭代器而不是容器,但通常传递整个容器是有用的。 – 2010-08-11 02:50:56

+0

我听说标准没有指定容器有多少个参数。一个向量至少有两个,但实现可能会为了他们自己的目的增加更多,使得“模板模板”的可移植性降低了? – UncleBens 2010-08-11 06:55:34