Von std::string Klasse ableiten?
-
Hallo, ich habe mir mit VS Code unter Windows folgende Klasse programmiert.
#pragma once #include <map> #include <string> namespace StdLibs { class String : public std::string { public: String() = default; String(const String& _string) = default; String(String&& _string) = default; String(const char* _string); String(const unsigned long _value); String(const std::size_t _value); String(const char* _string, const char* _placeHolder, const char* _replacementString); String(const char* _string, const char* _placeHolder, const unsigned long _value); String(const char* _string, const char* _placeHolder, const std::size_t _value); String(const char* _string, const std::map<std::string, std::string>& _placeHoldersAndReplacementStrings); virtual ~String() = default; String& operator=(const String& _string) = default; String& operator=(String&& _string) = default; virtual void replacePlaceHolder(const std::map<std::string, std::string>& _placeHoldersAndReplacementStrings); virtual void replacePlaceHolder(const std::string& _placeHolder, const std::string& _replacementString); }; }
Lässt sich ohne Fehler bauen (MinGW). Wenn ich diese Klasse versuche unter Ubuntu zu bauen, bekomme ich folgende Fehler:
g++ -g3 -O0 -Wall -Wextra -std=c++17 -c "exception.cpp" -o "debug/exception.o"
g++ -g3 -O0 -Wall -Wextra -std=c++17 -c "reference.cpp" -o "debug/reference.o"
g++ -g3 -O0 -Wall -Wextra -std=c++17 -c "string.cpp" -o "debug/string.o"
In file included from string.cpp:1:0:
string.hpp:16:4: error: ‘StdLibs::String::String(std::size_t)’ cannot be overloaded
String(const std::size_t _value);
^~~~~~
string.hpp:15:4: error: with ‘StdLibs::String::String(long unsigned int)’
String(const unsigned long _value);
^~~~~~
string.hpp:20:4: error: ‘StdLibs::String::String(const char*, const char*, std::size_t)’ cannot be overloaded
String(const char* _string, const char* _placeHolder, const std::size_t _value);
^~~~~~
string.hpp:19:4: error: with ‘StdLibs::String::String(const char*, const char*, long unsigned int)’
String(const char* _string, const char* _placeHolder, const unsigned long _value);
^~~~~~
string.cpp:27:2: error: redefinition of ‘StdLibs::String::String(std::size_t)’
String::String(const std::size_t _value)
^~~~~~
string.cpp:12:2: note: ‘StdLibs::String::String(long unsigned int)’ previously defined here
String::String(const unsigned long _value)
^~~~~~
string.cpp:71:2: error: redefinition of ‘StdLibs::String::String(const char*, const char*, std::size_t)’
String::String(const char* _string, const char* _placeHolder, const std::size_t _value)
^~~~~~
string.cpp:55:2: note: ‘StdLibs::String::String(const char*, const char*, long unsigned int)’ previously defined here
String::String(const char* _string, const char* _placeHolder, const unsigned long _value)
^~~~~~
makefile:4: recipe for target 'debug.all' failed
make: *** [debug.all] Error 1
The terminal process terminated with exit code: 2Terminal will be reused by tasks, press any key to close it.
Ich stehe gerade ein bisschen auf dem Schlauch. Warum sollte ich die Konstrukturen nicht überschreiben dürfen? Bzw. wieso kann ich keine eigenden Konstruktoren implementieren?
Torsten
-
string.cpp:27:2: error: redefinition of ‘StdLibs::String::String(std::size_t)’
String::String(const std::size_t _value)Die Signaturen im Header und cpp sollten gleich aussehen.
-
Die Fehler kommen daher, daß
unsigned long
undstd::size_t
als gleicher Datentyp angesehen werden und daher keine Überladung möglich ist.Generell ist es aber keine gute Idee von
std::string
(und anderen Klassen der C++ Standard Library) abzuleiten, da diese keinen virtuellen Destruktor bereitstellen.
-
@Th69 Danke dafür