0

请看下面的代码。

主文件

#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;

}

最大值.h

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;
    }

在 maximum.cpp 中,它给出“'T' 没有命名类型”错误。由于它是用户定义的,它可能无法识别它。如何解决这个问题呢?

4

5 回答 5

2

类模板的成员函数本身就是模板,必须这样定义:

template <typename T>   // <-- Add this
Maximum::Maximum()
{
    // code
}

template <typename T>   // <-- Add this
T Maximum::maximum(T value1, T value2, T value3)
{
    // code
}

一旦你解决了这个问题,你可能会得到一些链接器错误,因为必须(通常)在每个使用它们的翻译单元中定义模板。解决方法是将定义移动到头文件中。有关完整详细信息,请参阅此问题

于 2012-08-25T15:46:48.103 回答
1

在您的 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;
于 2012-08-25T15:10:49.130 回答
1

您对模板的理解是错误的。

首先,像这样的模板需要在使用前不知道的“用户定义”类型。所以它们不能在编译器必须知道所有内容的 .cpp 文件中找到(嗯,实际上它们可以,但现在让我们保持简单)。

因此,您的所有模板代码都应该在头文件中。这些头文件必须与使用您的代码的人共享。对于包含模板头的每个 CPP 文件,一切都将是已知的,并且可以进行编译。

然后,您正在使用一个类,而您需要的是一个函数。

因此,您的最终代码应限于:

最大.h。

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);

    ...
}
于 2012-08-25T15:21:13.473 回答
1

首先要使您的代码正常工作,请尝试以下代码。我做了一些改变。

主文件

#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>也不会生成定义,因为您的类模板定义MaximumMaximum.cpp中。并且因为您没有MAximum<char>Maximum.cpp中使用,所以不会在Maximum.cpp中生成链接时间的定义。因此,您必须显式实例化Maximum<char>链接时间。

于 2012-08-25T15:27:05.343 回答
1

首先,将maximum.cpp中的代码复制到maximum.h的末尾,然后删除maximum.cpp。编译器必须在使用模板的任何地方查看代码,因此模板代码应该几乎总是在定义模板的标头中。

其次,将成员函数的定义(您刚刚复制的代码)标记为模板:

template <class T>
Maximum<T>::Maximum() { }

等等

第三,注意构造函数不能返回值;中的return陈述Maximum::Maximum(T value1, T value2, T value3)是非法的。添加类型的数据元素T并将结果存储在那里;然后添加一个访问器,以便该类的用户可以获取存储的值。

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

于 2012-08-25T15:46:15.287 回答