From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12027 invoked by alias); 11 Jun 2002 21:26:05 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 11947 invoked by uid 71); 11 Jun 2002 21:26:02 -0000 Resent-Date: 11 Jun 2002 21:26:02 -0000 Resent-Message-ID: <20020611212602.11940.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, f_ker@yahoo.co.uk Received: (qmail 11840 invoked by uid 61); 11 Jun 2002 21:25:37 -0000 Message-Id: <20020611212537.11835.qmail@sources.redhat.com> Date: Tue, 11 Jun 2002 14:26:00 -0000 From: f_ker@yahoo.co.uk Reply-To: f_ker@yahoo.co.uk To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/7000: Compiler not picking up inherited function from base-class X-SW-Source: 2002-06/txt/msg00254.txt.bz2 List-Id: >Number: 7000 >Category: c++ >Synopsis: Compiler not picking up inherited function from base-class >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: rejects-legal >Submitter-Id: net >Arrival-Date: Tue Jun 11 14:26:01 PDT 2002 >Closed-Date: >Last-Modified: >Originator: f_ker@yahoo.co.uk >Release: 3.1 >Organization: >Environment: GNU/Linux gcc 3.1 i686 >Description: I am trying to use a generic base class to supply an operator()(T*) for all classes that have an operator()(T&) - but the compiler doesn't seem to pick up the operator()(T*) from the base class, and complains and rejects the code that tried to call it. Code: #include #include template class RefToPtrFObjConvertor { public: virtual void operator()(RefToPtrFObjConvertor_T_& arg) = 0; virtual void operator()(RefToPtrFObjConvertor_T_* arg) { operator()(*arg); } }; struct Vertex { bool is_transformed; class SetIsTransformedFlag : public RefToPtrFObjConvertor { public: bool value; SetIsTransformedFlag(bool arg) : value(arg) { } void operator()(Vertex& v) { v.is_transformed = value; } }; }; class Polygon { public: std::vector vertices; template class ForEachVertex { public: FObj_T_& fobj; ForEachVertex(FObj_T_& arg_fobj) : fobj(arg_fobj) { } void operator()(Polygon& polygon) { std::for_each(polygon.vertices.begin(), polygon.vertices.end(), fobj); } }; }; template Polygon::ForEachVertex do_for_each_vertex(T& arg) { return Polygon::ForEachVertex(arg); } std::vector polygons; void do_stuff1() { std::for_each(polygons.begin(), polygons.end(), do_for_each_vertex(Vertex::SetIsTransformedFlag(false))); } void do_stuff2() { Vertex::SetIsTransformedFlag fobj(false); std::for_each(polygons.begin(), polygons.end(), do_for_each_vertex(fobj)); } Full error message: test_inherit_fcall_operator.cc: In function `void do_stuff1()': test_inherit_fcall_operator.cc:91: could not convert `SetIsTransformedFlag(0)' to `Vertex::SetIsTransformedFlag&' test_inherit_fcall_operator.cc:81: in passing argument 1 of ` Polygon::ForEachVertex do_for_each_vertex(T&) [with T = Vertex::SetIsTransformedFlag]' /usr/lib/gcc-lib/i686-pc-linux-gnu/3.1/include/g++/bits/stl_algo.h: In function `_Function std::for_each(_InputIter, _InputIter, _Function) [with _InputIter = __gnu_cxx::__normal_iterator > >, _Function = Vertex::SetIsTransformedFlag]': test_inherit_fcall_operator.cc:69: instantiated from `void Polygon::ForEachVertex::operator()(Polygon&) [with FObj_T_ = Vertex::SetIsTransformedFlag]' /usr/lib/gcc-lib/i686-pc-linux-gnu/3.1/include/g++/bits/stl_algo.h:157: instantiated from `_Function std::for_each(_InputIter, _InputIter, _Function) [with _InputIter = __gnu_cxx::__normal_iterator > >, _Function = Polygon::ForEachVertex]' test_inherit_fcall_operator.cc:100: instantiated from here /usr/lib/gcc-lib/i686-pc-linux-gnu/3.1/include/g++/bits/stl_algo.h:157: no match for call to `(Vertex::SetIsTransformedFlag) (Vertex*&)' test_inherit_fcall_operator.cc:42: candidates are: virtual void Vertex::SetIsTransformedFlag::operator()(Vertex&) >How-To-Repeat: g++ -fsyntax-only file.cc >Fix: >Release-Note: >Audit-Trail: >Unformatted: