When I try to compile the code below, g++ reports "error: assuming cast to type
'bool (*)(evaluator&)' from overloaded function" on the line indicated. I have
isolated the comparison to the pointer to the template function "stop" as the
source of the problem. Is this the correct behavior?

   #include <iostream>

   struct evaluator { bool (*eval)(evaluator&); };

   template <typename T>
   bool stop(T &e) { return true; }

   bool eval(evaluator &e) { return true; }

   int main() {
      typedef bool (*evalf)(evaluator&);
      struct evaluator e = { stop<evaluator> };

      // error: assuming cast to type 'bool (*)(evaluator&)' from
      // overloaded function
      std::cout << (e.eval == stop<evaluator>) << '\n';

      // ok--eval is not templated
      std::cout << (e.eval == eval) << '\n';

      // ok--explicitly cast to correct type
      std::cout << (e.eval == static_cast<evalf>(stop<evaluator>)) << '\n';

      return 0;
   }

I compiled this using the MinGW port of g++ 3.4.2 on W2kSP4. I unfortunately do
not have easy access to g++ 4.1.1, however Kai-Uwe Bux reports the same result
from that version via comp.lang.c++ (discussion archived at
http://groups.google.com/group/comp.lang.c++/browse_frm/thread/b25fee316ec891b6).


-- 
           Summary: Comparison with Pointer to Template Function Requires
                    Explicit Cast
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: justin dot piper at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29187

Reply via email to