无法创建模板持有对象

Cannot create Template holding Objects

暂时没有问这个问题,希望能找到答案,但虽然我能找到类似的主题,但似乎没有什么能回答我这个问题。

我的任务(大学)是在模板中存储 int、char 和 Employee 对象 class 并按它们的值对它们进行排序。整数和字符不是问题,它们工作得很好,但我无法让模板构造函数接受员工。本周早些时候我才刚刚开始使用模板,希望有更多知识的人可以让我知道我在做什么 wrong/missing。

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
}

有人告诉我有 "no appropriate default constructor available"。在尝试与员工一起创建 "triple" 时。任何帮助将不胜感激。

当您在三元组 class 中使用构造函数时,因为您不使用初始化列表,将创建类型 T 的默认对象,然后在您替换每个元素的地方执行构造函数的主体.

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

改为像这样使用成员初始化器列表编写三元组的构造函数。

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

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

class 未在 成员初始化器列表 中显式初始化的任何数据成员都是默认初始化的。 member-initializer list 是构造函数的参数列表之后且在主体之前的部分:

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

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

首选使用成员初始化器列表来初始化您的数据成员。在 body 内部它变成了赋值,这并不总是你想要的:

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

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

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)
{ }