снова о шаблонах
От: shedever  
Дата: 27.01.07 20:45
Оценка:
Помогите решить задачку!! проблема в том, что линкер выдает unresolved для функции func1
Ясно, что точка инстанцирование функции func1 находится прямо под функцией func2,,,
но как решить все таки проблему!!??

template<typename T>
void func1(T)
{
}

template<typename Visitor>
void func2(Visitor visit)
{
visit();
}

void func3()
{
func2(boost::bind(func1<int>,1));
}
Re: снова о шаблонах
От: ILva_ Россия  
Дата: 27.01.07 21:02
Оценка:
Здравствуйте, 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, попробу указать их явно.
Re[2]: снова о шаблонах
От: shedever  
Дата: 27.01.07 21:09
Оценка:
компилятор vs2002,,
спасибо.. очень хороший совет..работает!!
template<typename T>
void func1(T)
{
}

template<typename Visitor>
void func2(Visitor visit)
{
visit();
}

void func3()
{
func2(boost::bind<void,int>(func1<int>,1));
}
Re[3]: снова о шаблонах
От: shedever  
Дата: 27.01.07 21:13
Оценка:
но хотелось бы заставить компилятор выводить самому аргументы bind,
хотя в 2002 студии он очень ленивый
Re[4]: снова о шаблонах
От: ILva_ Россия  
Дата: 27.01.07 21:31
Оценка:
Здравствуйте, shedever, Вы писали:

S>но хотелось бы заставить компилятор выводить самому аргументы bind,

S>хотя в 2002 студии он очень ленивый

Видимо ты не первый, кому это не понравилось
Вот Микрософт и решил эту проблему в 2005, обновляйся
Re[5]: снова о шаблонах
От: shedever  
Дата: 27.01.07 21:41
Оценка:
Здравствуйте, ILva_, Вы писали:

IL_>Здравствуйте, shedever, Вы писали:


S>>но хотелось бы заставить компилятор выводить самому аргументы bind,

S>>хотя в 2002 студии он очень ленивый

IL_>Видимо ты не первый, кому это не понравилось

IL_>Вот Микрософт и решил эту проблему в 2005, обновляйся

он даже это не может вывести,,.без bind'a

template<typename T>
void func1(T)
{
}

template<typename Visitor>
void func2(Visitor visit)
{
visit(1);
}

void func3()
{
func2(func1<int>);
}
Re: снова о шаблонах
От: shedever  
Дата: 28.01.07 19:03
Оценка:
Здравствуйте, 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); //ошибок море
}
};
Re[2]: снова о шаблонах
От: ILva_ Россия  
Дата: 28.01.07 21:28
Оценка:
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.
Re: снова о шаблонах
От: shedever  
Дата: 28.01.07 22:10
Оценка:
Здравствуйте, 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);
};

X x;

shared_ptr<X> p(new X);

int i = 5;

bind(&X::f, ref(x), _1)(i); // x.f(i)
bind(&X::f, &x, _1)(i); //(&x)->f(i)
bind(&X::f, x, _1)(i); // (internal copy of x).f(i)
bind(&X::f, p, _1)(i); // (internal copy of p)->f(i)


но вся проблема в том, как забиндить, повторю, шаблонный метод,(
я не нашел в документации эту тему...

struct X
{
template<typename T>
bool f(T a);
};

X x;

void func()
{
int i = 5;

bind(&X::f<int>, x, _1)(i); ///error

P.S. я бы посоветовал вам проверять ваши примеры, перед тем как выкладывать...
Re[2]: снова о шаблонах
От: ILva_ Россия  
Дата: 29.01.07 08:48
Оценка:
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)) то будет ошибка.
Re: снова о шаблонах
От: shedever  
Дата: 29.01.07 10:33
Оценка:
Здравствуйте, 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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.