如何将模板化容器类解析为类型

  • 本文关键字:类型 容器类 c++
  • 更新时间 :
  • 英文 :


我必须制作这个程序,在那里我记录用户的随机浏览历史;池";的用户。我快完成了,但我似乎找不到主方法中的行的问题;池p1((;。

这是我的代码:

#include <iostream>
#include <random>
#include <chrono>
using namespace std;
template <typename T>
class Users{
private:
//static constexpr int numUsers = 5;
T numWebsites;
vector<T> browsingHistory;
public:
Users(int nw);
void UrlGeneration();
vector<T> getBrowsingHistory();
int calculateMinVariety();
int calculateMinDifference();
friend ostream& operator<<(ostream&, const Users<T> &);
};
template <typename T>
ostream& operator<<(ostream& out, const Users<T> &u) {
typename vector<T>::iterator i;
for(i = u.getBrowsingHistory(); i != u.getBrowsingHistory().end(); i++){
out << *i << " ";
}
return out;
}
template <typename T>
Users<T>::Users(int nw){
numWebsites = nw;
}
template <typename T>
void Users<T>::UrlGeneration(){
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine randEng(seed);
std::uniform_int_distribution<T> distribution(0, numWebsites);
//Create a number of websites - digits 1  to 10.
//Create values
for(int i = 0; i < numWebsites; i++){
int randNum = distribution(randEng);
//Append them to the array for this user
browsingHistory.push_back(randNum);
}
}
template<typename T>
vector<T> Users<T>::getBrowsingHistory(){
return browsingHistory;
}
template <typename V>
class Pool{
private:
vector<V> users;
public:
void display();
void addUsers(V u);
Pool();
};
template <typename V>
Pool<V>::Pool(){
}
template <typename V>
void Pool<V>::display(){
for(V u: users){
cout << u;
}
}
template <typename V>
void Pool<V>::addUsers(V u){
users.push_back(u);
}

int main(){
Users<int> u1(10);
u1.UrlGeneration();
Pool<Users> p1();
p1.addUsers(u1);
p1.display();
return 0;
}

根据;Most Vexing Parse";,如果某个东西看起来像函数声明,则将其视为函数声明。

Pool<Users> p1();并不像您所期望的那样是一个变量声明。它是一个函数声明。它声明了一个不接受参数并返回Pool<Users>的函数p1

您想要的是一个名为p1、类型为Pool<Users>的变量。你需要去掉括号()才能得到,例如:

Pool<Users> p1;

或者,您可以使用大括号{}来代替:

Pool<Users> p1{};

永远不要使用空括号()来调用类型的默认构造函数。

也就是说,Users也是一个模板,因此您需要为其T模板参数提供一个类型,即:

Pool<Users<int>> p1;

最新更新