Помогите решить задачку!! проблема в том, что линкер выдает unresolved для функции func1
Ясно, что точка инстанцирование функции func1 находится прямо под функцией func2,,,
но как решить все таки проблему!!??
Здравствуйте, shedever, Вы писали:
S>Помогите решить задачку!! проблема в том, что линкер выдает unresolved для функции func1 S>Ясно, что точка инстанцирование функции func1 находится прямо под функцией func2,,, S>но как решить все таки проблему!!??
S>template<typename T> S>void func1(T) S>{ S>}
S>template<typename Visitor> S>void func2(Visitor visit) S>{ S> visit(); S>}
S>void func3() S>{ S> func2(boost::bind(func1<int>,1)); S>}
Какой ты используешь компилятор? Под msvc2005 все ок!
Скорее всего твой компилятор не может вывести тип аргументов для bind, попробу указать их явно.
Здравствуйте, ILva_, Вы писали:
IL_>Здравствуйте, shedever, Вы писали:
S>>но хотелось бы заставить компилятор выводить самому аргументы bind, S>>хотя в 2002 студии он очень ленивый
IL_>Видимо ты не первый, кому это не понравилось IL_>Вот Микрософт и решил эту проблему в 2005, обновляйся
Здравствуйте, shedever, Вы писали:
S>Помогите решить задачку!! проблема в том, что линкер выдает unresolved для функции func1 S>Ясно, что точка инстанцирование функции func1 находится прямо под функцией func2,,, S>но как решить все таки проблему!!??
S>template<typename T> S>void func1(T) S>{ S>}
S>template<typename Visitor> S>void func2(Visitor visit) S>{ S> visit(); S>}
S>void func3() S>{ S> func2(boost::bind(func1<int>,1)); S>}
продолжу тему... компилятор vs2003, не подскажет ли кто-нибудь, как забиндить шаблонный метод класса
class a
{
template<typename T>
void func1(T v)
{
}
void func2()
{
int i = 0;
boost::bind(a::func1,this, _1)(i); //ошибок море
}
};
S>продолжу тему... компилятор vs2003, не подскажет ли кто-нибудь, как забиндить шаблонный метод класса
S>class a S>{ S>template<typename T> S>void func1(T v) S>{ S>} S>void func2() S>{ S> int i = 0; S> boost::bind(a::func1,this, _1)(i); //ошибок море
Мне также как и вашемо компилятору не понятно, что значит эта строчка
S>} S>};
Чтобы использовать метод класса нужны адаптеры mem_fun и mem_fun_ref.
Например так:
boost::bind(std::mem_fun_ref(&a::func1<int>), 1); //ошибок больше нет!
Подробней можно почитать в MSDN.
Здравствуйте, shedever, Вы писали:
S>Помогите решить задачку!! проблема в том, что линкер выдает unresolved для функции func1 S>Ясно, что точка инстанцирование функции func1 находится прямо под функцией func2,,, S>но как решить все таки проблему!!??
S>template<typename T> S>void func1(T) S>{ S>}
S>template<typename Visitor> S>void func2(Visitor visit) S>{ S> visit(); S>}
S>void func3() S>{ S> func2(boost::bind(func1<int>,1)); S>}
к сожалению,. вы ошибаетесь,, тут вся проблема заключается в
a::func1<int>, а mem_fun_ptr тут ни совершенно не к месту, когда есть bind
(см документацию к bind)
//http://boost.org/libs/bind/bind.html#with_member_pointers
Example:
struct X
{
bool f(int a);
};
S>к сожалению,. вы ошибаетесь,, тут вся проблема заключается в S>a::func1<int>, а mem_fun_ptr тут ни совершенно не к месту, когда есть bind S>(см документацию к bind) S>//http://boost.org/libs/bind/bind.html#with_member_pointers S>Example: S>struct X S>{ S> bool f(int a); S>};
S>X x;
S>shared_ptr<X> p(new X);
S>int i = 5;
S>bind(&X::f, ref(x), _1)(i); // x.f(i) S>bind(&X::f, &x, _1)(i); //(&x)->f(i) S>bind(&X::f, x, _1)(i); // (internal copy of x).f(i) S>bind(&X::f, p, _1)(i); // (internal copy of p)->f(i)
S>но вся проблема в том, как забиндить, повторю, шаблонный метод,( S>я не нашел в документации эту тему...
S>struct X S>{ S> template<typename T> S> bool f(T a); S>};
S>X x;
S>void func() S>{ S>int i = 5;
S>bind(&X::f<int>, x, _1)(i); ///error
S>P.S. я бы посоветовал вам проверять ваши примеры, перед тем как выкладывать...
Да, mem_fun_ref тут не причем. Я с boost::bind не работал, написал что первое пришло в голову...
Но, почитав документацию и немного поупражнявшись, нашел следущее решение:
#include <boost/bind.hpp>
#include <boost/function.hpp>
struct X {
template<typename A>
void f(A a) { }
} ;
int main(int argc, char* argv[])
{
X x;
int val = 1;
boost::function<void (void)> pf = boost::bind((void(X::*)(int))&X::f<int>, &x, val);
pf();
}
Попробуй, такой код должен компилится!
Если убрать ((void(X::*)(int)) то будет ошибка.
Здравствуйте, shedever, Вы писали:
S>Помогите решить задачку!! проблема в том, что линкер выдает unresolved для функции func1 S>Ясно, что точка инстанцирование функции func1 находится прямо под функцией func2,,, S>но как решить все таки проблему!!??
S>template<typename T> S>void func1(T) S>{ S>}
S>template<typename Visitor> S>void func2(Visitor visit) S>{ S> visit(); S>}
S>void func3() S>{ S> func2(boost::bind(func1<int>,1)); S>}
есть такой тоже вариант, он немного покрасивше
boost::bind<void, a, int>(a::func1<int>, this, _1)(i);