0

テンプレートの宣言と定義を持つライブラリファイルSlist.hを使用しています。ライブラリファイルはmypgm.c(cppファイル)のコンストラクタでインスタンス化されます。コンパイラは、下部に記載されているエラーをスローします。

Slist.h

template <class Object>
class SList;     // fwd declaration.
template <class Object>
class SListItr;  // fwd declaration.
template <class Object>
class SListNode
{
    SListNode( const Object &theElement = Object( ),
               SListNode *n = NULL )
      : element( theElement ), next( n ) { }

    Object     element;
    SListNode *next;
    friend class SList<Object>;
    friend class SListItr<Object>;
};

template <class Object>
class SList
{
  public:
    SList( );
    SList( const SList &rhs );
    ~SList( );
    int isEmpty( ) const;
    void makeEmpty( );
    SListItr<Object> zeroth( ) const;
    SListItr<Object> first( ) const;
    const SList & operator=(  SList &rhs );
    int  IsType() {return LinkedListType;};
  private:
    SListNode<Object> *header;
    Object *ptr_Object;
};

//SList definition
template <class Object>
SList<Object>::SList( )
{
     ptr_Object = new Object();
     header = new  SListNode<Object>; 
}

// Copy constructor.
template <class Object>
SList<Object>::SList( const SList<Object> &rhs )
{
    header = new SListNode<Object>; 
    *this = rhs;
}

// Destructor.
template <class Object>
SList<Object>::~SList( )
{
    makeEmpty( );
    delete ptr_Object;
    delete header;
}

mypgm.c

class mypgm
{
public:
    mypgm::mypgm()
    {
    ptr_dead_acc_list= new SList<String>; // ptr_dead_acc_list is of type SList<String>
    }
 };

参照用の文字列クラスの詳細

class String
{
        private:
                char *_text;
                friend class String_Iterator;
        public:
                // ctors and dtor
                explicit String ();                     
                explicit String (char *);
                explicit String (int );
                String (String& );              
                ~String();

                /////////////////
                // conversions:
                /////////////////
                //  to C-like type char *
                operator char *() {return _text;}

                /////////////////
                // overloads:
                /////////////////
                // assignment String = String
                String &operator=(String &);
}

コンパイルエラー:

SList.h: In constructor 'SList<Object>::SList() [with Object = String]':
mypgm.c:131:   instantiated from here
SList.h:85: error: no matching function for call to 'String::String(String)'
String.h:27: note: candidates are: String::String(String&)
SList.h:41: error: in passing argument 1 of 'SListNode<Object>::SListNode(const Object&, SListNode<Object>*) [with Object = String]'
SList.h: In constructor 'SListNode<Object>::SListNode(const Object&, SListNode<Object>*) [with Object = String]':
SList.h:85:   instantiated from 'SList<Object>::SList() [with Object = String]'
mypgm.c:131:   instantiated from here
SList.h:42: error: passing 'const String' as 'this' argument of 'String::operator char*()' discards qualifiers
make: *** [all]

インスタントイオン中に引数が正しく渡されないと感じます。これを解決しようとしましたが、私の手順は無駄です。テンプレートの概念は初めてです。この問題を解決するのを手伝っていただけませんか。

これを調べてくれてありがとう

4

2 に答える 2

4

あなたの問題には何もありませんのコピーコンストラクターはString、定数への参照を受け入れる必要があります。これの代わりに:

String (String& );

署名は次のようになります。

String(String const&);

SListNode定数オブジェクトのコンストラクターを呼び出していStringますが、コピーコンストラクターが非定数参照を受け入れるため、コンパイラーは不平を言います:

SListNode( const Object &theElement = Object( ),
           SListNode *n = NULL )
  : element( theElement ), // ERROR: theElement is a reference to const!
    next( n ) { }

また、問題はテンプレートのインスタンス化に起因していますが、特にテンプレートに関連していないことに注意してください。非テンプレート コードで同じことを行うと、同じエラーが発生します。

于 2013-02-08T17:45:44.540 に答える
0

このエラーはテンプレートとは関係ありません。テンプレートのインスタンス化中にたまたまポップアップしただけです。あなたのクラスStringは「CopyConstructible」ではないため、通常の方法の多くで使用できないため、異常です。

おそらくコンストラクターが必要です

String(const String&);

それ以外の

String(String&);
于 2013-02-08T17:47:26.817 に答える