模板中的数据类型错误

Data type error in templates

本文关键字:数据类型 错误      更新时间:2023-10-16

请看下面的代码。

主.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 的数据元素并将结果存储在那里;然后添加一个访问器,以便此类的用户可以获取存储的值。

或者按照另一个答案中的建议,使其成为一个函数。这是一个更好的解决方案。