See: https://github.com/gazebosim/gz-msgs/commit/22c57006798470db63e8ecaff7b49dce34d5e76f

Index: gz-msgs-ignition-msgs5_5.11.1/src/Generator.cc
===================================================================
--- gz-msgs-ignition-msgs5_5.11.1.orig/src/Generator.cc
+++ gz-msgs-ignition-msgs5_5.11.1/src/Generator.cc
@@ -71,12 +71,12 @@ bool Generator::Generate(const FileDescr
                                OutputDirectory *_generatorContext,
                                std::string * /*_error*/) const
 {
-  std::string headerFilename = _file->name();
+  std::string headerFilename(_file->name());
   std::string delim = ".proto";
   size_t pos = headerFilename.rfind(delim);
   headerFilename.replace(pos, delim.size(), ".pb.h");
 
-  std::string sourceFilename = _file->name();
+  std::string sourceFilename( _file->name());
   pos = sourceFilename.rfind(delim);
   sourceFilename.replace(pos, delim.size(), ".pb.cc");
 
@@ -142,10 +142,11 @@ bool Generator::Generate(const FileDescr
     printer.Print("#endif\n", "name", "includes");
 
     // Call the IGN_REGISTER_STATIC_MSG macro
-    std::string factory = "IGN_REGISTER_STATIC_MSG(\"ign_msgs.";
-    factory += _file->message_type(0)->name() + "\", " +
-      _file->message_type(0)->name() +")";
-    printer.Print(factory.c_str(), "name", "includes");
+    std::stringstream factory;
+    factory << "IGN_REGISTER_STATIC_MSG(\"ign_msgs.";
+    factory << _file->message_type(0)->name() << "\", " <<
+      _file->message_type(0)->name() << ")";
+    printer.Print(factory.str(), "name", "includes");
   }
 
   // Inject code in the auto-generated header files immediately before closing
@@ -156,26 +157,27 @@ bool Generator::Generate(const FileDescr
     io::Printer printer(output.get(), '$');
 
     // Define std::unique_ptr types for our messages
-    std::string ptrTypes = "typedef std::unique_ptr<"
-      + _file->message_type(0)->name() + "> "
-      + _file->message_type(0)->name() + "UniquePtr;\n";
+    std::stringstream ptrTypes;
+    ptrTypes << "typedef std::unique_ptr<"
+      << _file->message_type(0)->name() << "> "
+      << _file->message_type(0)->name() << "UniquePtr;\n";
 
     // Define const std::unique_ptr types for our messages
-    ptrTypes += "typedef std::unique_ptr<const "
-      + _file->message_type(0)->name() + "> Const"
-      + _file->message_type(0)->name() + "UniquePtr;\n";
+    ptrTypes << "typedef std::unique_ptr<const "
+      << _file->message_type(0)->name() << "> Const"
+      << _file->message_type(0)->name() << "UniquePtr;\n";
 
     // Define std::shared_ptr types for our messages
-    ptrTypes += "typedef std::shared_ptr<"
-      + _file->message_type(0)->name() + "> "
-      + _file->message_type(0)->name() + "SharedPtr;\n";
+    ptrTypes << "typedef std::shared_ptr<"
+      << _file->message_type(0)->name() << "> "
+      << _file->message_type(0)->name() << "SharedPtr;\n";
 
     // Define const std::shared_ptr types for our messages
-    ptrTypes += "typedef std::shared_ptr<const "
-      + _file->message_type(0)->name() + "> Const"
-      + _file->message_type(0)->name() + "SharedPtr;\n";
+    ptrTypes << "typedef std::shared_ptr<const "
+      << _file->message_type(0)->name() << "> Const"
+      << _file->message_type(0)->name() << "SharedPtr;\n";
 
-    printer.Print(ptrTypes.c_str(), "name", "namespace_scope");
+    printer.Print(ptrTypes.str(), "name", "namespace_scope");
   }
 
   // Pop the warning suppression stack for MSVC
