Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 102039
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 11, 20262026-05-11T00:53:13+00:00 2026-05-11T00:53:13+00:00

Is there a way to undefine the += on strings and wstrings for chars

  • 0

Is there a way to undefine the += on strings and wstrings for chars and wchar_t?

Basically I want to avoid bugs like the following:

int age = 27;  std::wstring str = std::wstring(L'User's age is: '); str += age;  std::string str2 = std::string('User's age is: '); str2 += age; 

The above code will add the ascii character 27 to the string instead of the number 27.

I obviously know how to fix this, but my question is: how do I produce a compiler error in this situation?

Note: You can override += on std::string and int to properly format the string, but this is not what I want to do. I want to completely disallow this operator on these operands.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. 2026-05-11T00:53:13+00:00Added an answer on May 11, 2026 at 12:53 am

    You cannot deactivate a specific function of a class (here std::basic_string) as it is it’s interface that clearly (and officially) allow that manipulation. Trying to overload the operator will only mess things up.

    Now, you can ‘wrap’ std::basic_string in another class, using private inheritance or composition and then use the public interface as a proxy to the std::basic_string part, but only the functions you want to be usable.

    I recommand first replacing you string types with typedefs :

    namespace myapp {     typedef std::string String;     typedef std::wstring UTFString; } 

    Then once your application compile fine after having replaced std::string and std::wstring by myapp::String and myapp::UTFString (those are example names), you define the wrapper class somewhere :

    namespace myapp { /** std::basic_string with limited and controlled interface.     */     template< class _Elem, class _Traits, class _Ax >     class limited_string      {     public:         typedef std::basic_string< _Elem , _Traits, _Ax > _String; // this is for easier writing         typedef limited_string< _Elem, _Traits, _Ax > _MyType; // this is for easier writing      private:         _String m_string; // here the real std::basic_string object that will do all the real work!      public:          // constructor proxies... (note that those ones are not complete, it should be exactly the same as the original std::basic_string         // see some STL docs to get the real interface to rewrite)         limited_string() : m_string {}         limited_string( const _MyType& l_string ) : m_string( l_string.m_string ) {}         limited_string( const _Elem* raw_string ) : m_string( raw_string ) {}         //... etc...          // operator proxies...         _MyType& operator= ( const _MyType& l_string )          {             m_string = l_string.m_string;         }         // etc...         // but we don't want the operator += with int values so we DON'T WRITE IT!          // other function proxies...         size_t size() const { return m_string.size(); } // simply forward the call to the real string!         // etc...you know what i mean...          // to work automatically with other STL algorithm and functions we add automatic conversion functions:         operator const _Elem*() const { return m_string.c_str(); }           // etc..               }; } 

    …then, you simply replace those lines :

    // instead of those lines...     //typedef std::string String;      //typedef std::wstring UTFString;      // use those ones     typedef limited_string< char, std::char_traits<char>, std::allocator<char> >                String; // like std::string typedef     typedef limited_string< wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >       UTFString; // like std::wstring typedef  

    … and your example will crash :

    error C2676: binary '+=' : 'myapp::UTFString' does not define this operator or a conversion to a type acceptable to the predefined operator error C2676: binary '+=' : 'myapp::String' does not define this operator or a conversion to a type acceptable to the predefined operator 

    Here is the full test application code i wrote to prove that (compiled on vc9) :

    #include <string> #include <iostream>  namespace myapp {      /** std::basic_string with limited and controlled interface.     */     template< class _Elem, class _Traits, class _Ax >     class limited_string      {     public:         typedef std::basic_string< _Elem , _Traits, _Ax > _String; // this is for easier writing         typedef limited_string< _Elem, _Traits, _Ax > _MyType; // this is for easier writing      private:         _String m_string; // here the real std::basic_string object that will do all the real work!      public:          // constructor proxies... (note that those ones are not complete, it should be exactly the same as the original std::basic_string         // see some STL docs to get the real interface to rewrite)         limited_string() : m_string {}         limited_string( const _MyType& l_string ) : m_string( l_string.m_string ) {}         limited_string( const _Elem* raw_string ) : m_string( raw_string ) {}         //... etc...          // operator proxies...         _MyType& operator= ( const _MyType& l_string )          {             m_string = l_string.m_string;         }         // etc...         // but we don't want the operator += with int values so we DON'T WRITE IT!          // other function proxies...         size_t size() const { return m_string.size(); } // simply forward the call to the real string!         // etc...you know what i mean...          // to work automatically with other STL algorithm and functions we add automatic conversion functions:         operator const _Elem*() const { return m_string.c_str(); }           // etc..               };      // instead of those lines...     //typedef std::string String;      //typedef std::wstring UTFString;      // use those ones     typedef limited_string< char, std::char_traits<char>, std::allocator<char> >                String; // like std::string typedef     typedef limited_string< wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >       UTFString; // like std::wstring typedef  }  int main() {     using namespace myapp;      int age = 27;      UTFString str = UTFString(L'User's age is: ');     str += age; // compilation error!     std::wcout << str << std::endl;      String str2 = String('User's age is: ');     str2 += age; // compilation error!     std::cout << str2 << std::endl;      std::cin.ignore();      return 0; } 

    I think it would cleanly resolve your problem, but you’ll have to wrapp all the functions.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

is there way how to get name ov event from Lambda expression like with
Is there any way to make multi line strings that doesn't try to evaluate
Is there way to get file from windows xp command prompt? I tried to
Is there way to automatically maximize the output window on hitting build and then
Is there way to copy a file into Plone with WebDAV and have Plone
Is there way to better identify design pattern in source codes, esp. if you
Is there way to mute an audio stream or at least control the volume?
Is there way to set @include mixin(); to variable? I tried this @mixin bg-gradient($fallback,
Is there way that I can read the file from remote server using fopen
Is there any way in Notepad++ (or even with another tool) to change the

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.