2

私の実習課題は、さまざまなデータ型の配列をインスタンス化するためのテンプレート クラスを作成することです。ただし、テンプレートの「デフォルト」または「新しい」コンストラクターを INT 以外のデータ型として呼び出すと、次のエラーが表示されます。

Template.h: In constructor ‘Template<T>::Template() [with T = char]’:
main.cc:52:20:   instantiated from here
Template.h:71:5: error: cannot convert ‘char*’ to ‘int*’ in assignment
Template.h: In constructor ‘Template<T>::Template(int) [with T = char]’:
main.cc:58:35:   instantiated from here
Template.h:89:5: error: cannot convert ‘char*’ to ‘int*’ in assignment
Template.h: In constructor ‘Template<T>::Template(int) [with T = double]’:
main.cc:72:36:   instantiated from here
Template.h:89:5: error: cannot convert ‘double*’ to ‘int*’ in assignment
Template.h: In copy constructor ‘Template<T>::Template(const Template<T>&) [with T = double]’:
main.cc:73:35:   instantiated from here
Template.h:101:5: error: cannot convert ‘double*’ to ‘int*’ in assignment

ヘッダー ファイル: (コンストラクター定義の後に切り捨てられます。質問に答えるために必要に応じて投稿します)

#ifndef TEMPLATE_H
#define TEMPLATE_H
#include <iostream>    
using namespace std;

template <typename T>
class Template {
    friend istream & operator>>( istream & in, Template<T> & a ) {
       a.input();
       return in;
    }
    friend ostream & operator<<( ostream & out, const Template<T> & a ) {
       a.output();
       return out;
    }
public:
    Template<T> ();   // Default constructor
    Template<T> ( int );   // New constructor
    Template<T> ( const Template<T> & );   // Copy constructor
    ~Template<T> ();   // Destructor.

    // Operator overload prototypes.
    const Template<T> & operator=( const Template<T> & );
    const bool operator==( const Template<T> & );
    const bool operator!=( const Template<T> & );

    T & operator[]( int );  // Left hand operator.
    T operator[]( int ) const;  // Right hand operator.
private:
    // Member function prototypes
    bool isEqual ( const Template<T> & );
    void input();
    void output() const;

    static const int DEFAULTSIZE = 10; // Set default array size.
    static const int MAXSIZE = 100; // Set maximum array size.
    static T DEFAULTVALUE; // Set value of array elements.
    int size;
    int * ptr;
};    #endif

template <typename T>
T Template<T>::DEFAULTVALUE; // Instantiate DEFAULTVALUE of ADT T

/****************************Constructors*****************************/

// Default constructor
template <typename T>
Template<T>::Template() {
    size = DEFAULTSIZE;
    ptr = new T [size];     // Allocate memory for array[DEFAULTSIZE].
    for (int i = 0; i < size; i++) 
        ptr[i] = DEFAULTVALUE;  // Set all elements to DEFAULTVALUE.
}

// New constructor
template <typename T>
Template<T>::Template( int a ) {
    if (a < 1)
        size = DEFAULTSIZE; // Can't allocate array of <= 0 elements.
    else if (a > MAXSIZE)
        size = MAXSIZE; // Template can be no larger than 100 elements.
    else
        size = a;   // Valid argument, passed to size.

    ptr = new T [size];
    for (int i = 0; i < size; i++) 
        ptr[i] = DEFAULTVALUE;  // Set all elements to DEFAULTVALUE.
}

// Copy constructor
template <typename T>
Template<T>::Template( const Template<T> & b ) {
    size = b.size;
    ptr = new T [size]; // Set size to argument's array size.
    for (int i = 0; i < size; i++)
        ptr[i] = b.ptr[i]; // Copy elements.
}

// Destructor
template <typename T>
Template<T>::~Template () {
    for (int i = 0; i < size; i++) {
        delete ptr; // Deallocate memory.
        ptr = NULL; // Delete array elements.
    }
}

main.cc ファイルの関連部分: (52 行目から)

    Template<char> charOne; // Default constructor called for charOne

    cout << "Now specify size of array charOne: ";
    cin >> arrSize;
    cout << endl;

    Template<char> charTwo(arrSize); // New constructor call

    // Print contents of both arrays.
    cout << "Printing contents of both arrays:\n" << "charOne: " 
         << charOne << "charTwo: " << charTwo;

    // Check equality of charOne & charTwo.
    if (charOne == charTwo)
        cout << "charOne == charTwo.\n" << endl;
    else 
        cout << "charOne != charTwo.\n" << endl;

/**************************Double Template***************************/

    Template<double> dblOne(arrSize);
    Template<double> dblTwo(dblOne);
4

1 に答える 1

4

エラー: 代入で 'char*' を 'int*' に変換できません

このエラーは、次の行について不平を言っています:

 ptr = new T [size];

以前は、次のようにptr宣言されています。

int * ptr;

を構築するときでない限り、ptr = new T割り当ては機能Tしません。これを修正するには、 の定義を次のように変更します。intTemplateptr

T * ptr;
于 2013-07-04T06:26:37.783 に答える