Discussion:
najprosze możliwe pytanie z C++
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
RM
2020-04-14 07:49:50 UTC
Permalink
Uczę się C++. Mam taki kod:

#include <string>
...
std::string errors;
...
errors += "Invalid usage. Result directory must be different from
application directory.\n";

Nie rozumiem dlaczego błąd:
żaden operator "+=" nie pasuje do tych argumentów operacji -- typy
operandów: const std::__cxx11::string += const char [70]

Tym bardziej że w innym miejscu podobne przypisanie += się kompiluje.
Emru
2020-04-14 07:59:41 UTC
Permalink
Post by RM
żaden operator "+=" nie pasuje do tych argumentów operacji -- typy
operandów: const std::__cxx11::string += const char [70]
spróbuj może "Invalid usage..." przypisać najpierw do jakiegoś stringa

std::string tmp = "Invalid usage. Result directory must be different from
application directory.\n";
RM
2020-04-14 08:11:09 UTC
Permalink
Post by Emru
Post by RM
żaden operator "+=" nie pasuje do tych argumentów operacji -- typy
operandów: const std::__cxx11::string += const char [70]
spróbuj może "Invalid usage..." przypisać najpierw do jakiegoś stringa
std::string tmp = "Invalid usage. Result directory must be different from
application directory.\n";
src/obfuscator.cpp:258:19: error: passing ‘const string {aka const
std::__cxx11::basic_string<char>}’ as ‘this’ argument discards
qualifiers [-fpermissive]
errors += tmp;
Emru
2020-04-14 08:21:01 UTC
Permalink
http://www.cplusplus.com/reference/string/string/append/
http://www.cplusplus.com/reference/string/string/operator+=/

z jakiego kompilatora korzystasz?
RM
2020-04-14 08:30:39 UTC
Permalink
Post by Emru
Post by RM
żaden operator "+=" nie pasuje do tych argumentów operacji -- typy
operandów: const std::__cxx11::string += const char [70]
spróbuj może "Invalid usage..." przypisać najpierw do jakiegoś stringa
std::string tmp = "Invalid usage. Result directory must be different from
application directory.\n";
Znalazłem i poprawiłem błąd. errors było polem w klasie obfuscator a
całość była robiona w metodzie
obfuscator::make_result_dir() const
i właśnie to const przeszkadzało.
M.M.
2020-04-15 14:24:00 UTC
Permalink
Post by RM
Post by Emru
Post by RM
żaden operator "+=" nie pasuje do tych argumentów operacji -- typy
operandów: const std::__cxx11::string += const char [70]
spróbuj może "Invalid usage..." przypisać najpierw do jakiegoś stringa
std::string tmp = "Invalid usage. Result directory must be different from
application directory.\n";
Znalazłem i poprawiłem błąd. errors było polem w klasie obfuscator a
całość była robiona w metodzie
obfuscator::make_result_dir() const
i właśnie to const przeszkadzało.
Nie rozumiem.

U mnie nie ma problemu:

[[[[[[
#:~/test_str$ cat > main.cpp
#include <string>
#include <iostream>

int main() {
std::string str;
str += "test\n";
std::cout << str;
return 0;
}
#:~/test_str$ g++ main.cpp -o test_str
#:~/test_str$ ls -la
razem 28
drwxr-xr-x 2 m m 4096 kwi 15 16:21 .
drwxr-xr-x 22 m m 4096 kwi 15 16:19 ..
-rw-r--r-- 1 m m 132 kwi 15 16:21 main.cpp
-rwxr-xr-x 1 m m 13536 kwi 15 16:21 test_str
#:~/test_str$ ./test_str
test
]]]]]

Pozdrawiam
RM
2020-04-15 17:57:05 UTC
Permalink
Post by M.M.
Post by RM
Znalazłem i poprawiłem błąd. errors było polem w klasie obfuscator a
całość była robiona w metodzie
obfuscator::make_result_dir() const
i właśnie to const przeszkadzało.
Nie rozumiem.
Zmienna errors (pole klasy obfuscator) nie może być zmodyfikowana
wewnątrz metody const klasy obfuscator.
M.M.
2020-04-17 17:09:07 UTC
Permalink
Post by RM
Post by M.M.
Post by RM
Znalazłem i poprawiłem błąd. errors było polem w klasie obfuscator a
całość była robiona w metodzie
obfuscator::make_result_dir() const
i właśnie to const przeszkadzało.
Nie rozumiem.
Zmienna errors (pole klasy obfuscator) nie może być zmodyfikowana
wewnątrz metody const klasy obfuscator.
Dlaczego u mnie działa?

Pozdrawiam
g***@gmail.com
2020-04-17 20:00:31 UTC
Permalink
Post by M.M.
Post by RM
Post by M.M.
Post by RM
Znalazłem i poprawiłem błąd. errors było polem w klasie obfuscator a
całość była robiona w metodzie
obfuscator::make_result_dir() const
i właśnie to const przeszkadzało.
Nie rozumiem.
Zmienna errors (pole klasy obfuscator) nie może być zmodyfikowana
wewnątrz metody const klasy obfuscator.
Dlaczego u mnie działa?
Pozdrawiam
Bo nie używasz tego w metodzie zadeklarowanej jako const.

Pewnie gdyby OP wkleił cały kod, nie byłoby wątpliwości. Ale z jego wyjaśnienia wynika, że miał to użyte jakoś tak:

class obfuscator {
std::string errors;
//...
void make_result_dir() const {
// ...
errors += "Invalid usage";
// ...
}
//...
};
M.M.
2020-04-17 21:33:38 UTC
Permalink
Post by g***@gmail.com
Post by M.M.
Post by RM
Post by M.M.
Post by RM
Znalazłem i poprawiłem błąd. errors było polem w klasie obfuscator a
całość była robiona w metodzie
obfuscator::make_result_dir() const
i właśnie to const przeszkadzało.
Nie rozumiem.
Zmienna errors (pole klasy obfuscator) nie może być zmodyfikowana
wewnątrz metody const klasy obfuscator.
Dlaczego u mnie działa?
Pozdrawiam
Bo nie używasz tego w metodzie zadeklarowanej jako const.
class obfuscator {
std::string errors;
//...
void make_result_dir() const {
// ...
errors += "Invalid usage";
// ...
}
//...
};
Ok, dzięki.

Pozdrawiam.

g***@gmail.com
2020-04-14 08:30:26 UTC
Permalink
Post by RM
#include <string>
...
std::string errors;
...
errors += "Invalid usage. Result directory must be different from
application directory.\n";
żaden operator "+=" nie pasuje do tych argumentów operacji -- typy
operandów: const std::__cxx11::string += const char [70]
Tym bardziej że w innym miejscu podobne przypisanie += się kompiluje.
Wklej może cały kod na jakiś gist albo pastebin, bo tak to się nie da nic powiedzieć.
RM
2020-04-14 12:21:51 UTC
Permalink
Post by g***@gmail.com
Post by RM
Tym bardziej że w innym miejscu podobne przypisanie += się kompiluje.
Wklej może cały kod na jakiś gist albo pastebin, bo tak to się nie da nic powiedzieć.
Znalazłem i poprawiłem błąd. errors było polem w klasie obfuscator a
całość była robiona w metodzie
obfuscator::make_result_dir() const
i właśnie to const przeszkadzało.
Kontynuuj czytanie narkive:
Loading...