我有一个模板化的SortedLinkedList类,它按字符串字段中包含的值对主题A对象进行排序。
这里的主题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 )
{
}
答案 0 :(得分:4)
您可能正在调用两个隐式转换,从const char[7]
到std::string
,从std::string
到TopicA
。但是只允许一次隐式转换。您可以通过更明确地解决问题:
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 ) {}
答案 1 :(得分: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
。
char*
/ char[]
- &gt; std::string
std::string
- &gt; TopicA