无法创建包含对象的模板

Cannot create Template holding Objects

本文关键字:对象 包含 创建      更新时间:2023-10-16

一直在拖延这个问题一段时间,希望能找到答案,但尽管我能找到类似的主题,但似乎没有什么能回答我的问题。

我(大学)的任务是将int、chars和Employee对象存储在模板类中,并根据它们的值对它们进行排序。int和chars不是问题,它们工作得很好,但我无法让Employees被模板构造函数接受。本周早些时候,我才刚刚开始学习模板,希望有更深入了解的人能让我知道我做错了什么/遗漏了什么。

class Employee {
public:
  Employee(string, double);
  string getName();
  double getSalary();
  bool operator <(const Employee &);
  bool operator >(const Employee &);
private:
  string name;
  double salary;
};
Employee::Employee(string s, double d) {
  name = s;
  salary = d;
}
template<typename T>
class triple {
public:
  triple(T e1, T e2, T e3);
  T minimum();
  T median();
  T maximum();
private:
  T firstElement;
  T secondElement;
  T thirdElement;
};
template<typename T>
triple<T>::triple(T e1, T e2, T e3) {
  firstElement = e1;
  secondElement = e2;
  thirdElement = e3;
}

我的第一个问题,试着只显示所需的代码,希望没问题。我想我不应该把所有东西都粘贴在这里。

void main() {
  triple<int> tint(3, 1, 2);
  triple<char> tchar('b', 'a', 'c');
  Employee mark("Mark", 20000);
  Employee tom("Tom", 30000);
  Employee ed("Ed", 40000);
  triple<Employee> temp(mark, tom, ed); //This is giving me an error
}

我被告知"没有合适的默认构造函数可用"。当涉及到试图与员工建立"三重关系"时。如有任何帮助,我们将不胜感激。

成员初始值设定项列表中未显式初始化的任何类数据成员都是默认初始化的。成员初始值设定项列表是构造函数的参数列表之后的部分,位于正文之前:

X::X() : a(), b() { }
//     ^^^^^^^^^^
//    this part here

Employee类有一个用户声明的构造函数,该构造函数不是默认构造函数,因此,通常由编译器提供的类的默认构造函数是未声明的。这会导致编译错误,因为没有可调用的默认构造函数。

首选使用成员初始值设定项列表来初始化数据成员。在身体内部,它变成了任务,这并不总是你想要的:

template<typename T>
triple<T>::triple(T e1, T e2, T e3)
  : firstElement(e1)
  , secondElement(e2)
  , thirdElement(e3)
{ }

或者你可以给Employee类一个默认的构造函数,它也可以工作:

class Employee {
public:
  Employee() { } // or Employee() = default for >=C++11
  Employee(string, double);

此外,考虑参考const获取参数,因为您只是在尝试复制:

template<typename T>
triple<T>::triple(T const& e1, T const& e2, T const& e3)
  : firstElement(e1)
  , secondElement(e2)
  , thirdElement(e3)
{ }

当您在三重类中使用构造函数时,因为您没有使用初始值设定项列表,所以会创建类型为t的默认对象,然后执行构造函数的主体,在其中替换每个元素。

由于该员工没有默认构造函数,因此此操作失败。

相反,使用这样的成员初始值设定项列表为triple编写构造函数

template<typename T>
triple<T>::triple(T e1, T e2, T e3)
  : firstElement(e1), secondElement(e2), thirdElement(e3)
{}

在这种情况下,不需要构造第一个默认对象,因此Employee类不需要默认构造函数。