0

次のコードを見てください。

メイン.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;

}

最大.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

まず、コードを機能させるには、次のコードを試してください。私はいくつかの変更を加えました。

メイン.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.cpp内にあるため、Maximum呼び出しても定義は生成されません。また、 Maximum.cpp内で使用しなかったため、リンク時にMaximum.cpp内で定義が生成されません。このため、リンク時に明示的にインスタンス化する必要があります。Maximum<char>MaximumMAximum<char>Maximum<char>

于 2012-08-25T15:27:05.343 に答える
1

最初に、コードを maximum.cpp から maximum.h の最後までコピーし、次に maximum.cpp を削除します。コンパイラは、テンプレートが使用されている場所ならどこでもコードを確認する必要があるため、テンプレート コードは、ほとんどの場合、テンプレートが定義されているヘッダーにある必要があります。

次に、メンバー関数の定義 (コピーしたばかりのコード) をテンプレートとしてマークします。

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

第 3 に、コンストラクターは値を返すことができないことに注意してください。のreturnステートメントMaximum::Maximum(T value1, T value2, T value3)は違法です。タイプのデータ要素を追加し、Tそこに結果を保存します。次に、アクセサーを追加して、このクラスのユーザーが格納された値を取得できるようにします。

または、別の回答で行われた提案に従って、これを関数にします。それははるかに良い解決策です。

于 2012-08-25T15:46:15.287 に答える
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
}

Main.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 に答える