无法创建模板持有对象
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)
{ }
暂时没有问这个问题,希望能找到答案,但虽然我能找到类似的主题,但似乎没有什么能回答我这个问题。
我的任务(大学)是在模板中存储 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)
{ }