W bibliotece example (regex.cpp) autor biblioteki utworzył niestandardową strukturę (magic_number) i funkcję sprawdzania poprawności tej struktury, aby pokazać, w jaki sposób niestandardową strukturę można zintegrować z opcjami programu. Podążyłem za jego przykładem, aby utworzyć funkcję sprawdzania poprawności dla niestandardowej klasy (MyClass). Compiler narzeka, że leksykalny_cast nie jest dostępny dla MyClass. Następnie zaimplementowałem std::istream& operator>>(std::istream& in, MyClass& d)
, usunięto void validate(.., MyClass*, ..)
, kod kompiluje. Czy ktoś może wyjaśnić, dlaczego przykład nie wymaga operator>>
, a mój nie wymaga validate
?opcje programu boost: czy niestandardowy weryfikator wymaga operatora przeciążającego >>?
EDIT:
#include <MyLib/MyClass.h>
std::istream& operator>>(std::istream& in, MyClass& obj) {
// some code to populate obj
return in;
}
po::variables_map parseCommandLine(int argc, char* argv[]) {
po::options_description options("Options");
options.add_options()
("help", "produce help message")
("obj", po::value<MyClass>(), "")
;
po::variables_map vm;
store(po::command_line_parser(argc, argv)
.options(options).run(), vm);
notify(vm);
return vm;
}
int main(int argc, char* argv[]) {
try {
po::variables_map vm = parseCommandLine(argc, argv);
MyClass obj = vm["my"].as<MyClass>();
cout << obj << endl;
} catch(std::exception& e) {
cout << e.what() << "\n";
return 1;
}
return 0;
}
- kod kompiluje bez sprawdzenia poprawności.
Próbowałem też dokonywania minimalnej zmianie do regex.cpp:
- usuń magic_number
- dodać
#include <MyLib/MyClass.h>
- zastąpić wszystkie występowaniu gazów magic_number przez MojaKlasa.
- skomentuj wszystkie kody w walidacji.
- To nie kompiluje.
EDYCJA: dodać validate
. Żadne z nich nie rozwiązało błędu kompilatora.
void validate(boost::any& v,
const std::vector<std::string>& values,
std::vector<MyClass>*, int)
{
}
void validate(boost::any& v,
const std::vector<std::string>& values,
MyClass*, long)
{
}
void validate(boost::any& v,
const std::vector<std::string>& values,
MyClass*, int)
{
}
EDYCJA: Może odnosić się do przestrzeni nazw.
Po tym, jak otoczyłem funkcję sprawdzania poprawności przez namespace boost { namespace program_options { }}
, kod skompilowany bez przeciążenia op >>. Działa również, gdy validate jest umieszczany w tej samej przestrzeni nazw co MyClass. Czy ktoś może to wyjaśnić?
Czy możemy zobaczyć, jak zadeklarowałeś obiekt 'program_opcje'? Jeśli nie ma sprawdzania poprawności, nie można przetworzyć obiektu bez 'op >>. –
To jest problem kompilatora. Zobacz [Opis problemu tutaj] [1] [1]: http://stackoverflow.com/questions/13501598/c-the-context-of-an-unqualified-name-lookup- in-a-template –