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

  • Home
  • SEARCH
  • 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

Ask A Question

Stats

  • Questions 81k
  • Answers 82k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer PDFsharp does not support AES for Adobe 7+ yet. May 11, 2026 at 4:34 pm
  • Editorial Team
    Editorial Team added an answer There doesn't appear to be much to choose between them.… May 11, 2026 at 4:34 pm
  • Editorial Team
    Editorial Team added an answer Normally, collections are initialized by the parent object: public List<Message>… May 11, 2026 at 4:34 pm

Related Questions

In ruby, is there a way to undefine a variable or constant once it's
I have a MXML with a form, and inside it, two TextInputs. I hate
Is there a way to detect if the user is holding down the shift
Is there a way to make Perl's Template display warnings for all undefined values

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

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.