boost :: program_options: как объявить и проверить мой собственный тип опции, когда он принадлежит пространству имен - PullRequest
3 голосов
/ 24 июля 2010

Используя boost :: program_options, я не могу получить свой собственный тип опции для компиляции, когда он объявлен внутри пространства имен. Однако вне пространства имен он компилируется и работает нормально:

#include <boost/program_options.hpp>
using namespace boost;
using namespace boost::program_options;

struct my_type1 {
    my_type1(int nn) : n(nn) {}
    int n;
};
namespace nm  {
    struct my_type2 {
        my_type2(int nn) : n(nn) {}
        int n;
    };
}

void validate(boost::any& v,
              const std::vector<std::string>& values,
              my_type1*, int)  {
    const std::string& s = validators::get_single_string(values);
    v = any(my_type1(lexical_cast<int>(s)));
}
void validate(boost::any& v,
              const std::vector<std::string>& values,
              nm::my_type2*, int)  {
    const std::string& s = validators::get_single_string(values);
    v = any(nm::my_type2(lexical_cast<int>(s)));
}

int main()  {
    options_description desc("options");
    desc.add_options()
        ("m1", value<my_type1>()    , "")
        ("m2", value<nm::my_type2>(), "")
    ;
    return 0;
}

В main () объявление опции 'm1' компилируется, но 'm2' не ... Чего не хватает ? Я использую boost_1_43_0 с gcc версии 4.4.4.

1 Ответ

5 голосов
/ 24 июля 2010

Функция проверки должна находиться в том же пространстве имен, что и ваша структура my_type, изменить на:

  namespace nm  {
     void validate(boost::any& v,
                const std::vector<std::string>& values,
                  my_type2*, int)  {
      const std::string& s = validators::get_single_string(values);
      v = any(my_type2(lexical_cast<int>(s)));
    }
  }

, когда она компилируется для меня.

...