没有合适的构造函数可以从“const char [7]”转换为“TopicA”

时间:2013-02-05 08:30:43

标签: c++ templates constructor

我有一个模板化的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()时,编译器会在标题中给出错误。为什么?我没有从stringTopicA的转换构造函数?

如果它与TopicA( const string & arg )

的定义有任何区别
TopicA::TopicA( const string & arg ) : sValue( arg ), dValue( 0 ), iValue( 0 )
{
}

2 个答案:

答案 0 :(得分:4)

您可能正在调用两个隐式转换,从const char[7]std::string,从std::stringTopicA。但是只允许一次隐式转换。您可以通过更明确地解决问题:

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

  1. char* / char[] - &gt; std::string
  2. std::string - &gt; TopicA