无法创建持有对象的模板

时间:2015-02-15 17:17:57

标签: c++ templates

暂时不停地问这个问题,希望能找到答案,但是虽然我能找到类似的主题,但似乎没有什么可以解决这个问题。

我的任务是(大学)在模板类中存储int,chars和Employee对象,并按其值排序。这些内容和字符都是一个问题,它们工作得非常好,但是我无法让模板构造函数接受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
}

我被告知有#34;没有合适的默认构造函数&#34;。当谈到尝试创建&#34;三重&#34;与员工。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

当您在三元组中使用构造函数时,如果不使用初始化程序列表,则会创建类型为T的默认对象,然后执行构造函数的主体,在此处替换每个元素。

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

而是使用成员初始化列表来编写三元组的构造函数。

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

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

答案 1 :(得分:2)

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

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

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

首选使用member-initializer列表初始化您的数据成员。在身体内部,它变成了一个并不总是你想要的任务:

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