<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Invalid conversion from &#96;const Option* const&#x27; to &#96;Option*&#x27;]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich fang gerade an, mich in C++ einzuarbeiten und hab direkt das erste unlösbare Problem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Meinen Kenntnissstand von Programmierung allgemein würde ich als hoch einschätzen, bezüglich C++ bin ich jedoch maximal fortgeschrittener Anfänger.</p>
<p>Ich habe eine Klasse entwickelt, welche eine per Parameter bestimmte Textdatei lädt und daraus Optionen ausliest.<br />
Pro Zeile steht eine Anweisung im Stil option = wert.<br />
Zeilen, die mit einer Raute auskommentiert sind, werden dabei genau wie Leerzeilen übersprungen.</p>
<p>Der Zugriff soll lesend mittels [] erfolgen, also z.B. durch config[&quot;mysql_user&quot;]. Da die Konfiguration nicht im Programm verändert wird, sondern nur durch ändern der Textdatei erfolgt, dachte ich mir das Configobjekt global konstant zu deklarieren um von überall Zugriff zu haben. Leider krieg ich die folgende Fehlermeldung:</p>
<blockquote>
<p>E:/cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_iterator.h: In constructor <code>\_\_gnu\_cxx::\_\_normal\_iterator&lt;\_Iterator, \_Container&gt;::\_\_normal\_iterator(const \_\_gnu\_cxx::\_\_normal\_iterator&lt;\_Iter, \_Container&gt;&amp;) \[with \_Iter = const Option*, \_Iterator = Option*, \_Container = std::vector&lt;Option, std::allocator&lt;Option&gt; &gt;\]': ..\\integrator\\Config.cpp:55: instantiated from here E:/cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_iterator.h:609: error: invalid conversion from \</code>const Option* const' to `Option*'<br />
Build error occurred, build is stopped</p>
</blockquote>
<p>Der Code sieht wie folgt aus:</p>
<p>Config.h</p>
<pre><code class="language-cpp">#if !defined(_CONFIG_H)
#define _CONFIG_H

#include &lt;string&gt;
#include &lt;vector&gt;

struct Option {
	std::string identifier, value;

	inline Option(): 
			identifier(),
			value() { }

	inline Option(std::string id):
		identifier(id),
		value() { }

	inline Option(std::string id, std::string val): 
		identifier(id),
		value(val) { }

	inline bool operator ==(const Option &amp;opt) const {
		return (this-&gt;identifier == opt.identifier);
	}
};

class Config {
	std::vector&lt;Option&gt; opts;
public:
	std::string operator [](const std::string &amp;id) const;
	Config(std::string fname);
};

#endif  //_CONFIG_H
</code></pre>
<p>Config.cpp</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &quot;Config.h&quot;

using namespace std;

Config::Config(string fname) {
	ifstream f;
	string buf; // Variablenname, Wert
	char c;

	opts = vector&lt;Option&gt;(10);

	opts[0] = Option(&quot;log_file&quot;, 	&quot;log.txt&quot;);
	opts[1] = Option(&quot;error_file&quot;, 	&quot;error.txt&quot;);
	opts[2] = Option(&quot;manual_file&quot;, &quot;man.pdf&quot;);
	opts[3] = Option(&quot;mail_dir&quot;, 	&quot;~/mails/&quot;);
	opts[4] = Option(&quot;tpl_dir&quot;, 	&quot;~/tpl/&quot;);
	opts[5] = Option(&quot;mysql_user&quot;, 	&quot;root&quot;);
	opts[6] = Option(&quot;mysql_pw&quot;, 	&quot;&quot;);
	opts[7] = Option(&quot;mysql_host&quot;, 	&quot;localhost&quot;);
	opts[8] = Option(&quot;mysql_port&quot;, 	&quot;3306&quot;);
	opts[9] = Option(&quot;mysql_db&quot;, 	&quot;default&quot;);

	std::vector&lt;Option&gt;::iterator i = opts.end();

	f.open(fname, ios::in);

	buf = &quot;&quot;;
	while (!f.eof()) {

		switch (c = f.get()) {
			case '#': 	while ( !f.eof() &amp;&amp; (c = f.get()) != '\n');
						if (f.eof())
							break;
			case '\n': 	if (buf != &quot;&quot;) {
							i-&gt;value = buf;
						}
						buf = &quot;&quot;;
						break;

			case '=': 	i = find(opts.begin(), opts.end(), buf);
						if (i == opts.end())
							while (!f.eof() &amp;&amp; f.get() != '\n');
						buf = &quot;&quot;;
						break;

			case ' ': 	break;			

			default: 	buf += c;
		}
	}
}

string Config::operator [](const string &amp;id) const {
	std::vector&lt;Option&gt;::iterator i = find(opts.begin(), opts.end(), id);

	return (i != opts.end()) ? i-&gt;value : &quot;&quot;;
}
</code></pre>
<p>Main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

extern const Config config(&quot;../config.txt&quot;);

int main(int argc, char *argv[]) {	
	 std::cout &lt;&lt; &quot;Hello World - &quot; &lt;&lt; config[&quot;mysql_user&quot;];

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/190519/invalid-conversion-from-const-option-const-to-option</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 15:26:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/190519.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Aug 2007 15:21:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Invalid conversion from &#96;const Option* const&#x27; to &#96;Option*&#x27; on Thu, 23 Aug 2007 15:21:25 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich fang gerade an, mich in C++ einzuarbeiten und hab direkt das erste unlösbare Problem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Meinen Kenntnissstand von Programmierung allgemein würde ich als hoch einschätzen, bezüglich C++ bin ich jedoch maximal fortgeschrittener Anfänger.</p>
<p>Ich habe eine Klasse entwickelt, welche eine per Parameter bestimmte Textdatei lädt und daraus Optionen ausliest.<br />
Pro Zeile steht eine Anweisung im Stil option = wert.<br />
Zeilen, die mit einer Raute auskommentiert sind, werden dabei genau wie Leerzeilen übersprungen.</p>
<p>Der Zugriff soll lesend mittels [] erfolgen, also z.B. durch config[&quot;mysql_user&quot;]. Da die Konfiguration nicht im Programm verändert wird, sondern nur durch ändern der Textdatei erfolgt, dachte ich mir das Configobjekt global konstant zu deklarieren um von überall Zugriff zu haben. Leider krieg ich die folgende Fehlermeldung:</p>
<blockquote>
<p>E:/cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_iterator.h: In constructor <code>\_\_gnu\_cxx::\_\_normal\_iterator&lt;\_Iterator, \_Container&gt;::\_\_normal\_iterator(const \_\_gnu\_cxx::\_\_normal\_iterator&lt;\_Iter, \_Container&gt;&amp;) \[with \_Iter = const Option*, \_Iterator = Option*, \_Container = std::vector&lt;Option, std::allocator&lt;Option&gt; &gt;\]': ..\\integrator\\Config.cpp:55: instantiated from here E:/cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_iterator.h:609: error: invalid conversion from \</code>const Option* const' to `Option*'<br />
Build error occurred, build is stopped</p>
</blockquote>
<p>Der Code sieht wie folgt aus:</p>
<p>Config.h</p>
<pre><code class="language-cpp">#if !defined(_CONFIG_H)
#define _CONFIG_H

#include &lt;string&gt;
#include &lt;vector&gt;

struct Option {
	std::string identifier, value;

	inline Option(): 
			identifier(),
			value() { }

	inline Option(std::string id):
		identifier(id),
		value() { }

	inline Option(std::string id, std::string val): 
		identifier(id),
		value(val) { }

	inline bool operator ==(const Option &amp;opt) const {
		return (this-&gt;identifier == opt.identifier);
	}
};

class Config {
	std::vector&lt;Option&gt; opts;
public:
	std::string operator [](const std::string &amp;id) const;
	Config(std::string fname);
};

#endif  //_CONFIG_H
</code></pre>
<p>Config.cpp</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &quot;Config.h&quot;

using namespace std;

Config::Config(string fname) {
	ifstream f;
	string buf; // Variablenname, Wert
	char c;

	opts = vector&lt;Option&gt;(10);

	opts[0] = Option(&quot;log_file&quot;, 	&quot;log.txt&quot;);
	opts[1] = Option(&quot;error_file&quot;, 	&quot;error.txt&quot;);
	opts[2] = Option(&quot;manual_file&quot;, &quot;man.pdf&quot;);
	opts[3] = Option(&quot;mail_dir&quot;, 	&quot;~/mails/&quot;);
	opts[4] = Option(&quot;tpl_dir&quot;, 	&quot;~/tpl/&quot;);
	opts[5] = Option(&quot;mysql_user&quot;, 	&quot;root&quot;);
	opts[6] = Option(&quot;mysql_pw&quot;, 	&quot;&quot;);
	opts[7] = Option(&quot;mysql_host&quot;, 	&quot;localhost&quot;);
	opts[8] = Option(&quot;mysql_port&quot;, 	&quot;3306&quot;);
	opts[9] = Option(&quot;mysql_db&quot;, 	&quot;default&quot;);

	std::vector&lt;Option&gt;::iterator i = opts.end();

	f.open(fname, ios::in);

	buf = &quot;&quot;;
	while (!f.eof()) {

		switch (c = f.get()) {
			case '#': 	while ( !f.eof() &amp;&amp; (c = f.get()) != '\n');
						if (f.eof())
							break;
			case '\n': 	if (buf != &quot;&quot;) {
							i-&gt;value = buf;
						}
						buf = &quot;&quot;;
						break;

			case '=': 	i = find(opts.begin(), opts.end(), buf);
						if (i == opts.end())
							while (!f.eof() &amp;&amp; f.get() != '\n');
						buf = &quot;&quot;;
						break;

			case ' ': 	break;			

			default: 	buf += c;
		}
	}
}

string Config::operator [](const string &amp;id) const {
	std::vector&lt;Option&gt;::iterator i = find(opts.begin(), opts.end(), id);

	return (i != opts.end()) ? i-&gt;value : &quot;&quot;;
}
</code></pre>
<p>Main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

extern const Config config(&quot;../config.txt&quot;);

int main(int argc, char *argv[]) {	
	 std::cout &lt;&lt; &quot;Hello World - &quot; &lt;&lt; config[&quot;mysql_user&quot;];

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1350595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350595</guid><dc:creator><![CDATA[noNeed 4 aNick]]></dc:creator><pubDate>Thu, 23 Aug 2007 15:21:25 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid conversion from &#96;const Option* const&#x27; to &#96;Option*&#x27; on Thu, 23 Aug 2007 15:57:18 GMT]]></title><description><![CDATA[<p>Das Problem ist, dass die Methode</p>
<pre><code class="language-cpp">string Config::operator [](const string &amp;id) const
</code></pre>
<p>const ist. Dadurch ist &quot;this&quot; const und alle Mitglieder von this auch. In dem Fall Dein vector opts. Du versuchst einen modifizierbaren Iterator von diesem vector zu bekommen. Du musst hier einen const_iterator nehmen.</p>
<pre><code class="language-cpp">string Config::operator [](const string &amp;id) const {
    std::vector&lt;Option&gt;::const_iterator i = find(opts.begin(), opts.end(), id);

    return (i != opts.end()) ? i-&gt;value : &quot;&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1350613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350613</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 23 Aug 2007 15:57:18 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid conversion from &#96;const Option* const&#x27; to &#96;Option*&#x27; on Thu, 23 Aug 2007 15:59:40 GMT]]></title><description><![CDATA[<p>Das ganze hättest Du auch Zeilenweise einlesen und die Schlüssel und Werte in eine map speichern können:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;

using namespace std;

int main(int argc, char* argv[])
{
	map&lt;string, string&gt; config;
	string configfile = &quot;config.txt&quot;;
	ifstream in(configfile.c_str());

	if(in.is_open())
	{
		string line;
		while(getline(in, line))
		{
			if(line.empty()) // Leerzeile
				continue;

			stringstream ss;
			string key, value, op;
			ss &lt;&lt; line;
			ss &gt;&gt; key &gt;&gt; op &gt;&gt; value;

			if(key[0] == '#') //Kommentar
				continue;

			if(op == &quot;=&quot;) // Wir haben eine Zuweisung
				config.insert(pair&lt;string, string&gt;(key, value));
		}
		in.close();
	}

	string key = &quot;mysql_user&quot;;
	cout &lt;&lt; key &lt;&lt; &quot;: &quot; &lt;&lt; config[&quot;mysql_user&quot;] &lt;&lt; endl;

	cin.get();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1350614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350614</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Thu, 23 Aug 2007 15:59:40 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid conversion from &#96;const Option* const&#x27; to &#96;Option*&#x27; on Thu, 23 Aug 2007 16:39:50 GMT]]></title><description><![CDATA[<p>Danke, werd's morgen direkt probieren, wenn ich wieder an meinem Rechner bin.</p>
<p>Das mit der map hab ich auch festgestellt, da hatte ich aber schon den Großteil fertiggeschrieben gehabt und hatte dann keine Lust es zu ändern ^^</p>
<pre><code class="language-cpp">ss &lt;&lt; line;
ss &gt;&gt; key &gt;&gt; op &gt;&gt; value;

if(key[0] == '#') //Kommentar
    continue;

if(op == &quot;=&quot;) // Wir haben eine Zuweisung
    config.insert(pair&lt;string, string&gt;(key, value));
</code></pre>
<p>Die Zuweisung auf die drei Strings erscheint mir hochgradig nichtdeterministisch, ist das denn effizient, das so zu lösen?</p>
<p>Ansonsten sieht das um einiges eleganter, unkryptischer als mein kleiner Algo aus...</p>
<p>EDIT:<br />
Ah, jetzt bin ich dahinter gestiegen. Der &gt;&gt; Operator schneidet automatisch an den whitespaces ab, oder?<br />
Aber in dem Fall ist sowas hier nicht möglich:<br />
mysql_user=theDude</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350626</guid><dc:creator><![CDATA[noNeed 4 aNick]]></dc:creator><pubDate>Thu, 23 Aug 2007 16:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to Invalid conversion from &#96;const Option* const&#x27; to &#96;Option*&#x27; on Thu, 23 Aug 2007 20:01:42 GMT]]></title><description><![CDATA[<p>Ja hast recht.<br />
Hier könnte eine Trim-Funktion für strings helfen</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;map&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
using namespace std;

// von CodeProject
void trim(string&amp; str)
{
  string::size_type pos = str.find_last_not_of(' ');
  if(pos != string::npos) {
    str.erase(pos + 1);
    pos = str.find_first_not_of(' ');
    if(pos != string::npos) str.erase(0, pos);
  }
  else str.erase(str.begin(), str.end());
}

int main(int argc, char* argv[])
{
	map&lt;string, string&gt; config;
	string configfile = &quot;config.txt&quot;;
	ifstream in(configfile.c_str());

	if(in.is_open())
	{
		string line;
		while(getline(in, line))
		{
			if(line.empty()) // Leerzeile
				continue;

			if(line[0] == '#') //Kommentar
				continue;

			string::size_type pos = line.find(&quot;=&quot;);

			if(pos == string::npos)
				continue;

			string key = line.substr(0, pos), value = line.substr(pos+1);
			trim(key);
			trim(value);
			config.insert(pair&lt;string, string&gt;(key, value));
		}
		in.close();
	}

	for(map&lt;string, string&gt;::iterator it = config.begin(); it != config.end(); ++it)
		cout &lt;&lt; (*it).first &lt;&lt; &quot;: &quot; &lt;&lt; (*it).second &lt;&lt; endl;

	cin.get();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1350712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350712</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Thu, 23 Aug 2007 20:01:42 GMT</pubDate></item></channel></rss>