1

Topic A オブジェクトを文字列フィールドに含まれる値でソートする、テンプレート化された SortedLinkedList クラスがあります。

トピック A は次のとおりです。

struct TopicA
{
string sValue;
double dValue;
int iValue; 

TopicA();
TopicA( const string & arg );

bool operator> ( const TopicA & rhs ) const;
bool operator< ( const TopicA & rhs ) const;
bool operator== ( const TopicA & rhs ) const;
bool operator!= ( const TopicA & rhs ) const;
};

"tulgey"文字列フィールドにTopicA オブジェクトが格納されるリスト内の位置を見つけたいので、呼び出しますヘッダーAList.getPosition( "tulgey" );は次のとおりです。getPosition()

template <class ItemType>
int SortedLinkedList<ItemType>::getPosition( const ItemType& anEntry ) const

しかし、コンパイラを呼び出そうとするとgetPosition()、タイトルにエラーが表示されます。なんで?stringからへの変換コンストラクターがありませんTopicAか?

違いがある場合は、次の定義がありTopicA( const string & arg )ます。

TopicA::TopicA( const string & arg ) : sValue( arg ), dValue( 0 ), iValue( 0 )
{
}
4

2 に答える 2

5

おそらく、 from と from の 2 つの暗黙的な変換を呼び出しconst char[7]std::stringstd::stringますTopicA。ただし、許可される暗黙的な変換は 1 つだけです。より明示的にすることで問題を解決できます。

AList.getPosition( std::string("tulgey") ); // 1 conversion
AList.getPosition( TopicA("tulgey") );      // 1 conversion

別の方法として、次TopicAのものを取るコンストラクターを指定することもできconst char*ます。

TopicA( const char * arg ) : sValue( arg ), dValue( 0 ), iValue( 0 ) {}
于 2013-02-05T08:34:17.833 に答える
3

これらはうまくいくでしょう

AList.getPosition( TopicA("tulgey") ); 

AList.getPosition( TopicA("tulgey") ); 

std::string query = "tulgey";
AList.getPosition( query  ); 

または、別の変換コンストラクターを定義することもできます

TopicA( const char* arg );

今、物事はあなたが望むように機能します

AList.getPosition( "tulgey" );

問題は、2つの暗黙的な変換が必要だったことです。標準では 1 つしか許可されていません。文字列リテラルは ではchar配列C++として表され、 では表されないことに注意してくださいstring

  1. char*/ char[]->std::string
  2. std::string->TopicA
于 2013-02-05T08:33:51.973 に答える