2011-07-22 77 views
10

請考慮以下代碼。爲什麼編譯器不執行類型轉換?

#include <iostream> 
#include <string> 

struct SimpleStruct 
{ 
    operator std::string() { return value; } 
    std::string value; 
}; 

int main() 
{ 
    std::string s; // An empty string. 
    SimpleStruct x; // x.value constructed as an empty string. 

    bool less = s < x; // Error here. 
    return 0; 
} 

此代碼無法在g ++或Microsoft Visual C++中編譯。編譯器給出的錯誤報告是no match for operator '<' in 's < x'。現在的問題是,爲什麼編譯器不能根據簡單轉換SimpleStruct xstringoperator string()然後用operator < (string, string)

回答

13

operator<std::string是一個函數模板。過載如下:

template<class charT, class traits, class Allocator> 
    bool operator< (const basic_string<charT,traits,Allocator>& lhs, 
      const basic_string<charT,traits,Allocator>& rhs); 
    template<class charT, class traits, class Allocator> 
    bool operator< (const basic_string<charT,traits,Allocator>& lhs, 
      const charT* rhs); 
    template<class charT, class traits, class Allocator> 
    bool operator< (const charT* lhs, 
      const basic_string<charT,traits,Allocator>& rhs); 

您的呼叫與任何可用的重載都不匹配,因此它們全部從候選列表中刪除。由於沒有選擇函數模板作爲解決調用的候選項,所以沒有任何可以將SimpleStruct轉換爲。

template <class T> 
class String 
{ 
}; 

template <class T> 
bool operator< (const String<T>&, const String<T>&) { return true; } 


//if a suitable non-template function is available, it can be picked 
//bool operator< (const String<char>&, const String<char>&) { return true; } 

struct SimpleStruct 
{ 
    operator String<char>() { return value; } 
    String<char> value; 
}; 

int main() 
{ 
    String<char> s; 
    SimpleStruct ss; 
    s < ss; //the call doesn't match the function template, leaving only the commented-out candidate 
} 
+1

+1,這個答案是正確的。 'string :: operator <()'不會將參數作爲'const string&',而是'basic_string <>';如果你全局超載'operator <',那麼它就可以工作。 http://www.ideone.com/vMERa – iammilind

+1

Eh,'std :: string'只是'std :: basic_string '的一個typedef。 'typedef'不會引入新的類型,因此不會影響重載。 – MSalters

+2

潛在的問題是,charT'的''中模板<類圖表,類TR,類的Alloc>布爾運算符<(標準:: basic_string的<圖表,TR,的Alloc>常量&LHS扣,性病:: basic_string的<圖表, tr,Alloc> const & rhs);'failed。沒有'charT',其中'basic_string '_equals_'SimpleStruct'。這確實將它從過載集中移除。 – MSalters

相關問題