无法创建包含对象的模板
Cannot create Template holding Objects
一直在拖延这个问题一段时间,希望能找到答案,但尽管我能找到类似的主题,但似乎没有什么能回答我的问题。
我(大学)的任务是将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
类不需要默认构造函数。
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 如何在h文件中包含.o对象文件
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 具有包含其他对象的类的对象创建顺序
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- C++ 在堆栈中包含多态属性的类对象存储
- 链表包含 c++ 中不同的派生类对象
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 如何在构建时将 JSON 文件/对象包含在C++中
- 当对象包含其他对象的向量时,无法设置值
- 在矢量内创建一个对象,该对象由另一个对象包含
- 为什么在 C++ 中,当对象包含在另一个对象中时,复制构造函数被调用两次
- 当对象包含指针成员时,堆栈上的对象销毁出现分段错误
- 如果插槽对象包含互斥锁和条件变量,则 Boost signals2 connect() 调用编译失败
- 当包含对象包含unique_ptr时,如何删除向量的元素
- vector包含类对象,每个类对象包含3个字符串.我如何找到特定的字符串,然后删除整个元素
- 自定义对象的STL集合,每个对象包含一个STL集合
- 有多少对象(包含 std::vectors)加载到 L1/L2/L3 缓存中
- 将主应用程序对象包含在 try-catch 块中捕获所有崩溃