#include <iostream>
struct Int {
int i;
operator int() const noexcept {return i;}
};
int main() {
Int i;
i.i = 1;
std::cout << i;
}
ただし、これは GCC 4.8.1 でのコンパイルに失敗します。
#include <iostream>
#include <string>
struct String {
std::string s;
operator std::string() const {return s;}
};
int main() {
String s;
s.s = "hi";
std::cout << s;
}
エラーの関連部分は次のとおりです。
エラー: 'operator<<' に一致しません (オペランドの型は 'std::ostream {aka std::basic_ostream}' と 'String' です)
std::cout << s;をちょきちょきと切る
template std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::basic_string<_CharT, _Traits, _Alloc>&)
operator<<(basic_ostream<_CharT , _Traits>& __os,/usr/include/c++/4.8/bits/basic_string.h:2753:5: 注: テンプレート引数の推論/置換に失敗しました:
main.cpp:25:18: 注: 「文字列」は「const std::」から派生したものではありませんbasic_string<_CharT, _Traits, _Alloc>'<br> std::cout << s;
同じテンプレート引数を持つstd::cout
とのみを使用します。std::string
のように暗黙的な変換を取得できない理由が本当にわかりませんInt
。int
では機能するのに、では機能しないのはなぜstd::string
ですか?