From: Václav Slavík Date: Wed, 20 Jun 2007 07:47:51 +0000 (+0000) Subject: remove implicit conversion to C strings from wxString if wxUSE_STL=1; this fixes... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7978bc7293461eb09f4575e04ccf215b270e086e remove implicit conversion to C strings from wxString if wxUSE_STL=1; this fixes problems with converting between wxString and std::string in some situations at the cost of having to use c_str() explicitly just as you have to when using std::string git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46554 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/string.h b/include/wx/string.h index a715911343..7cccebcad3 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -1003,7 +1003,12 @@ public: wxString(const std::string& str) { assign(str.c_str(), str.length()); } #endif +#endif // wxUSE_STD_STRING + // Unlike ctor from std::string, we provide conversion to std::string only + // if wxUSE_STL and not merely wxUSE_STD_STRING (which is on by default), + // because it conflicts with operator const char/wchar_t*: +#if wxUSE_STL #if wxUSE_UNICODE_WCHAR && wxUSE_STL_BASED_WXSTRING // wxStringImpl is std::string in the encoding we want operator const wxStdWideString&() const { return m_impl; } @@ -1176,8 +1181,13 @@ public: // implicit conversion to C string operator wxCStrData() const { return c_str(); } + + // these operators conflict with operators for conversion to std::string, + // so they must be disabled in STL build: +#if !wxUSE_STL operator const char*() const { return c_str(); } operator const wchar_t*() const { return c_str(); } +#endif // implicit conversion to untyped pointer for compatibility with previous // wxWidgets versions: this is the same as conversion to const char * so it diff --git a/tests/strings/stdstrings.cpp b/tests/strings/stdstrings.cpp index 9cb81dffe6..3721bf9372 100644 --- a/tests/strings/stdstrings.cpp +++ b/tests/strings/stdstrings.cpp @@ -1,4 +1,4 @@ -/////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// // Name: tests/strings/stdstrings.cpp // Purpose: wxString unit test // Author: Vadim Zeitlin, Wlodzimierz ABX Skiba @@ -101,7 +101,7 @@ void StdStringTestCase::StdConstructors() CPPUNIT_ASSERT( s7 == s1 ); CPPUNIT_ASSERT( s8 == _T("efgh") ); - const char *pc = s1; + const char *pc = s1.c_str(); WX_ASSERT_STR_EQUAL( "bcd", wxString(pc + 1, pc + 4) ); const wchar_t *pw = s2.c_str(); @@ -165,7 +165,7 @@ void StdStringTestCase::StdAssign() CPPUNIT_ASSERT( s5 == _T("aaa") ); CPPUNIT_ASSERT( s6 == _T("ef") ); - const char *pc = s1; + const char *pc = s1.c_str(); s7.assign(pc, pc + 2); WX_ASSERT_STR_EQUAL( "de", s7 ); @@ -539,10 +539,21 @@ void StdStringTestCase::StdConversion() CPPUNIT_ASSERT( s3 == "std::wstring value" ); wxString s4("hello"); + + // wxString -> std::string conversion is only available in wxUSE_STL case, + // because it conflicts with conversion to const char*/wchar_t*: +#if wxUSE_STL std::string s5 = s4; CPPUNIT_ASSERT( s5 == "hello" ); wxStdWideString s6 = s4; CPPUNIT_ASSERT( s6 == "hello" ); +#endif + + std::string s7(s4); + CPPUNIT_ASSERT( s7 == "hello" ); + + wxStdWideString s8(s4); + CPPUNIT_ASSERT( s8 == "hello" ); } #endif // wxUSE_STD_STRING diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index c679d4423e..6cbeba609f 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -736,10 +736,13 @@ void StringTestCase::CStrDataImplicitConversion() wxString s("foo"); CPPUNIT_ASSERT( CheckStrConstWChar(s, s.c_str()) ); - CPPUNIT_ASSERT( CheckStrConstWChar(s, s) ); - CPPUNIT_ASSERT( CheckStrConstChar(s, s.c_str()) ); + + // implicit conversion of wxString is not available in STL build +#if !wxUSE_STL + CPPUNIT_ASSERT( CheckStrConstWChar(s, s) ); CPPUNIT_ASSERT( CheckStrConstChar(s, s) ); +#endif } void StringTestCase::ExplicitConversion()