Problem z std::binary_function

0

Cześć

Mam problem z funktorem dziedziczącym z std::binary_function.

 class RemoveFunctor : public std::binary_function<Component* const, char const * const, bool>
	{
		result_type operator() (first_argument_type component_p, second_argument_type componentName_p)
		{
			...
		}
	};

Otrzymuję następujący error:

Error 1 error C2535: 'bool std::binder2nd<_Fn2>::operator ()(Component *const &) const' : member function already defined or declared c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional 341

Gdy zrobię tak

 class RemoveFunctor : public std::binary_function<Component*, char const * const, bool>

to otrzymam

Error 1 error C3848: expression having type 'const Composite::RemoveFunctor' would lose some const-volatile qualifiers in order to call 'bool Composite::operator ()(Component *,const char *const )' c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional 342

Funktor ma operować na kontenerze, którego elementami są Component const* . Czy jest fizyczna możliwość, żeby to zadziałało? boost::bind albo nowy std::bind nie wchodzą w grę.

Dzięki z góry!

0
class RemoveFunctor
  {
   bool operator() (const Component *a,const Component *b)const
     {
      ...
     }
  };

Do funkcji przekazujesz: fun(...,...,RemoveFunctor());

0

Cholera jasna, zapomniałem najważniejszego. Wywołanie wygląda tak

remove_if(BeginIt, EndIt, std::bind2nd(RemoveFunctor(), value));
0
_13th_Dragon napisał(a):
class RemoveFunctor
  {
   bool operator() (const Component *a,const Component *b)const
     {
      ...
     }
  };

Do funkcji przekazujesz: fun(...,...,RemoveFunctor());

W Twoim przykładzie są kompletenie inne typy:

Pierwszy argument który chcę przekazać jest stałym wskaźnikiem na zmienną(w Twoim przykładzie wskaźnik na stałą zmienną)
Drugi argument to stały wskaźnik na stałą zmienną(w Twoim przykładzie wskaźnik na stałą zmienną)

0

po pierwsze gdzie public? po drugie spróbowałbym najpierw identyko z jakąś dokumentacją. Czyli:

struct RemoveFunctor : public binary_function<Component* const, char const * const, bool> {
    result_type operator() (first_argument_type component_p, second_argument_type componentName_p) {
        ...
        return ...;
    }
};

po trzecie nie pokazałeś gdzie i jak używasz tego RemoveFunctor (coś mi się wydaje, że tu jest problem).

0
MarekR22 napisał(a):

po pierwsze gdzie public? po drugie spróbowałbym najpierw identyko z jakąś dokumentacją. Czyli:

struct RemoveFunctor : public binary_function<Component* const, char const * const, bool> {
    result_type operator() (first_argument_type component_p, second_argument_type componentName_p) {
        ...
        return ...;
    }
};

po trzecie nie pokazałeś gdzie i jak używasz tego RemoveFunctor (coś mi się wydaje, że tu jest problem).

Hej

Użycie jest w moim drugim poście.

0

To jak? Może mi ktoś potwierdzić, czy robię coś źle, czy faktycznie nie da się tego zrobić(taka jest póki co moja opinia)?

0
class RemoveFunctor : public std::binary_function<const Component*, const char *, bool>
        {
                public: result_type operator() (first_argument_type component_p, second_argument_type componentName_p) const
                {

                }
        };

a jak chcesz to swoje dziwaczne Component * const, to po prostu

class RemoveFunctor : public std::binary_function<Component*, const char *, bool>

i reszta bez zmian.

0
rychu_elektryk napisał(a):

To jak? Może mi ktoś potwierdzić, czy robię coś źle, czy faktycznie nie da się tego zrobić(taka jest póki co moja opinia)?
może okraś to odpowiednio const'ami, to mi działa.

0
Azarien napisał(a):
class RemoveFunctor : public std::binary_function<const Component*, const char *, bool>
        {
                public: result_type operator() (first_argument_type component_p, second_argument_type componentName_p) const
                {

                }
        };

a jak chcesz to swoje dziwaczne Component * const, to po prostu

class RemoveFunctor : public std::binary_function<Component*, const char *, bool>

i reszta bez zmian.

Też sądziłem, że zabranie consta rozwiąże sprawę. Niestety powoduje to error podany przeze mnie już w pierwszym poście, czyli:

Error 1 error C3848: expression having type 'const Composite::RemoveFunctor' would lose some const-volatile qualifiers in order to call 'bool Composite::operator ()(Component *,const char *const )' c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional 342

Co jest według Ciebie dziwacznego w moim type?

0
MarekR22 napisał(a):
rychu_elektryk napisał(a):

To jak? Może mi ktoś potwierdzić, czy robię coś źle, czy faktycznie nie da się tego zrobić(taka jest póki co moja opinia)?
może okraś to odpowiednio const'ami, to mi działa.

Może coś naprostuję. Potrafię korzystać z funktorów i std2bind. Problem mam tylko wtedy, kiedy algortym iteruje po elementach "T * const". Przykład, który pokazałeś nie odzwierciedla mojego problemu.

0

Dobra już widzę wczym probem. Problem jest w algorytmie remove_if, który działa inaczej niż tego oczekujesz. remove_if nie zmienia wielkości kontenera, ergo używa operatora przypisnia, który nie zadziała dla stalych elementów. Mój przyklad jest dla vector, ale można go przerobić na liste i efekt bedzie ten sam.
Najlepiej napisz własny algorytm, albo wywal prawy const z kontenera.

1 użytkowników online, w tym zalogowanych: 0, gości: 1