LINUX.ORG.RU

Boost program_options and Generic selector trouble!


0

0

Я пишу класс обёртку вокруг boost::program_options
и столкнулся с проблемой компиляции вот этого метода:

///////////////////////////////////////////////////////////////////
// General options selector
template <class T>
void CmdLine::GetOption(const std::string& Name, T& var)
{
   if (VariablesMap_.count(Name)) var = VariablesMap_[Name].as<T>();
}
////////////////////////////////////////////////////////////////////

Ошибки следующие:
Compiling OBJ/Cmdline.oIn file included from CmdLineParse/Cmdline.hpp:46,
                 from CmdLineParse/Cmdline.cpp:7:
CmdLineParse/Cmdline.tcc: In member function `void CmdLine::GetOption(const
   std::string&, T&)':
CmdLineParse/Cmdline.tcc:7: syntax error before `>' token

Не могу понять где тут ошибка синтаксиса?!

Вроде в доке всё аналогично:
http://www.boost.org/doc/html/program_options/tutorial.html#id1246788

Причём если я из main вызову данный код:
....
CmdLine CC;
// Пока в debug моде VariablesMap_ - public
int i = CC.VariablesMap_["foo"].as<int>();
....
То всё скомпилируется!!!

Не могу понять в чём трабла?
Может в вызове из шаблонного метода? Но это бред!

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от aton

>template <class T> void CmdLine::GetOption(const std::string& Name, T& var)

Её определение в файле CmdLine.tcc, который включается через #include 
в header!!!

Да и ошибка то - синтаксическая!!!

Krivenok_Dmitry
() автор топика

#include <boost/program_options/variables_map.hpp>
#include <string>
#include <iostream>

namespace po = boost::program_options;

po::variables_map VariablesMap_;

template<class T> void foo(std::string const& name, T& var) {
	std::cout << __PRETTY_FUNCTION__ << std::endl;
	
	if (VariablesMap_.count(name)) var = VariablesMap_[name].template as<T>();
}

struct test {};

int main() {

	int a = 0;
	test t;
	
	foo("hehe", a);
	foo("some more hehe", t);
	
}

------
работает, обратить внимание на ключевое влово template перед as<T>()

AnToXa
()
Ответ на: комментарий от AnToXa

>if (VariablesMap_.count(name)) var = VariablesMap_[name].template as<T>();

Никогда не писал так :) Даже не знал, что так можно.


Мой старый вариант не работал с gcc-3.2.3
Однака с gcc-4.0.0 всё компилируется отлично.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

так иногда нужно :)

ну это у gcc свои заморочки, собсна там template не обязательно писать по стандарту, но вот приходится, чтобы gcc одуплился, я тестил код на 3.3.3 @ suse linux 9.3.

AnToXa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.