模板中的数据类型错误
Data type error in templates
请看下面的代码。
主.cpp
#include <iostream>
#include "Maximum.h"
using namespace std;
int main()
{
Maximum max;
int int1, int2, int3;
cout << "Input three integers: ";
cin >> int1 >> int2 >> int3;
cout << "The maximum value is: " << max.maximum(int1,int2,int3) << endl;
double double1, double2, double3;
cout << "Input three doubles: ";
cin >> double1 >> double2, double3;
cout << "The maximum value is: " << max.maximum(double1, double2, double3) << endl;
char char1, char2, char3;
cout << "Input three char values: ";
cin >> char1 >> char2 >> char3;
cout << "The maximum value is: " << max.maximum(char1,char2,char3) << endl;
}
最大时
template <class T>
class Maximum
{
public:
Maximum();
T maximum(T value1, T value2, T value3);
};
最大值.cpp
#include <iostream>
#include "Maximum.h"
Maximum::Maximum()
{
}
T Maximum::maximum(T value1, T value2, T value3)
{
T maximumValue = value1;
if(value2>maximumValue)
{
maximumValue = value2;
}
if(value3>maximumValue)
{
maximumValue = value3;
}
return maximumValue;
}
最多.cpp,它会给出"'T'不命名类型"错误。由于它是用户定义的,因此可能无法识别它。如何解决这个问题?
类模板的成员函数本身就是模板,必须这样定义:
template <typename T> // <-- Add this
Maximum::Maximum()
{
// code
}
template <typename T> // <-- Add this
T Maximum::maximum(T value1, T value2, T value3)
{
// code
}
修复此问题后,您可能会遇到一些链接器错误,因为模板必须(通常(在使用它们的每个翻译单元中定义。解决方法是将定义移动到头文件中。有关完整详细信息,请参阅此问题。
在你的 Maximum.cpp 中,你的构造函数和函数应该像这样调用
template <class T>
Maximum<T>::Maximum()
{
}
template <class T>
T Maximum<T>::maximum(T value1, T value2, T value3)
{
T maximumValue = value1;
if(value2>maximumValue)
{
maximumValue = value2;
}
if(value3>maximumValue)
{
maximumValue = value3;
}
return maximumValue;
}
在你的主函数中,你应该这样调用类
Maximum<int> max;
你对模板的理解是错误的。
首先,像这样的模板需要一个在使用前不知道的"用户定义"类型。因此,在编译器必须知道所有内容的文件中.cpp都找不到它们(好吧,实际上它们可以,但让我们暂时保持简单(。
因此,所有模板代码都应在头文件中。这些头文件必须与使用您的代码的人员共享。对于包含模板标题的每个 CPP 文件,一切都是已知的,并且可以进行编译。
然后,你正在使用一个类,而你需要的是一个函数。
因此,您的最终代码应限制为:
最大时
template<class T>
T Maximum(T v1, T v2, T v3) {
// code in your member function
}
主.cpp:
#include <iostream>
#include "Maximum.h"
using namespace std;
int main()
{
double d1, d2, d3;
double max = Maximum(d1, d2, d3);
...
}
首先,要使您的代码正常工作,请尝试以下代码。我做了一些更改。
主.cpp
#include <iostream>
#include "Maximum.h"
using namespace std;
int main()
{
Maximum<char> max; // here you must explicitly specify template argument, I choosed "char"
int int1, int2, int3;
cout << "Input three integers: ";
cin >> int1 >> int2 >> int3;
cout << "The maximum value is: " << max.maximum(int1,int2,int3) << endl;
double double1, double2, double3;
cout << "Input three doubles: ";
cin >> double1 >> double2, double3;
cout << "The maximum value is: " << max.maximum(double1, double2, double3) << endl;
char char1, char2, char3;
cout << "Input three char values: ";
cin >> char1 >> char2 >> char3;
cout << "The maximum value is: " << max.maximum(char1,char2,char3) << endl;
}
最大值.cpp
#include <iostream>
#include "Maximum.h"
template <class T> // add this line
Maximum<T>::Maximum()
{
}
template <class T> // you must add this line
T Maximum<T>::maximum(T value1, T value2, T value3) // also here Maximum<T>:: and not Maximum::
{
T maximumValue = value1;
if(value2>maximumValue)
{
maximumValue = value2;
}
if(value3>maximumValue)
{
maximumValue = value3;
}
return maximumValue;
}
template class Maximum<char>;// you have to explicitly instantiate Maximum<char> for linking time.
您必须知道,在 Main 中.cpp没有类模板的定义Maximum
所以即使您调用Maximum<char>
也不会生成任何定义,因为您的类模板定义Maximum
位于 Maximum.cpp 中,并且由于您没有在 Max 中使用MAximum<char>
.cpp因此在 Maximum 中不会生成任何定义.cpp对于链接时间。 因此,您必须显式实例化链接时间的Maximum<char>
。
首先,将代码从 maximum.cpp 复制到 maximum.h 的末尾,然后删除 maximum.cpp。无论使用模板,编译器都必须看到代码,因此模板代码几乎应始终位于定义模板的标头中。
其次,将成员函数(刚刚复制的代码(的定义标记为模板:
template <class T>
Maximum<T>::Maximum() { }
等。
第三,请注意构造函数不能返回值;Maximum::Maximum(T value1, T value2, T value3)
中的return
语句是非法的。添加类型为 T
的数据元素并将结果存储在那里;然后添加一个访问器,以便此类的用户可以获取存储的值。
或者按照另一个答案中的建议,使其成为一个函数。这是一个更好的解决方案。
- Static_cast转换为错误的数据类型,但结果仍然正确?
- 错误 - 自定义数据类型作为有效负载,带有提升::几何
- C++:自定义数据类型向量错误的队列
- 使用对数据类型的向量的哈希表中的分段错误错误
- 类中的静态函数给出了错误:声明中的两种或多个数据类型
- 错误:'x'声明中的两个或多个数据类型
- 如何使用 C++ 驱动程序在 MongoDB 中使用 UserException 处理数据类型错误
- 为什么数据类型转换错误只出现在C++中而不出现在C中
- 我该怎么做 throw 来处理 C++ 中的错误数据类型
- C++指针给出数据类型为"int"的错误,但与"char"一起工作正常
- 模板中的数据类型错误
- OpenCV 数据类型错误
- 错误:main的声明中有两个或多个数据类型
- 错误:函数声明中的两种或多种数据类型
- C++函数声明中的两个或多个数据类型的错误
- 从自定义数据类型列表中删除时出现 C2678 错误
- 类中的编译器错误,数据类型为 typedef map<std::string,std::p air<std::string,vector<int>>> MapPai
- 由于数据类型的范围有限,比较总是错误的
- 如何检测错误的数据类型
- PostgreSql查询参数数据类型错误