Re: Pointer to virtual method in child class as template parameter
 
On 7 17 ,   11 12 , Stephan Tolksdorf <andor...@gmx.de> wrote:
Hi all,
Could maybe somebody explain why all the compilers (Comeau, GCC, MSVC)
I tested printed error messages similar to
"error: argument of type "void (A::*)()" is incompatible with template
parameter of type "BMethodPointer"
D<&B::doSomething> d;
   ^
"
when compiling the following code snippet.
--
#include <iostream>
class A { // interface
public:
     virtual void doSomething() = 0;
};
class B : public A { }; // extended interface
class C : public B { // implementation
     virtual void doSomething() {
         std::cout << "test";
     }
};
typedef void (B::* BMethodPointer)();
template <BMethodPointer p>
class D {
     D() { // constructor that calls p on a C instance
         C c;
         (c.*p)();
     }
};
int main() {
     BMethodPointer p = &B::doSomething; // this compiles
     C c;
     (c.*p)();
     D<&B::doSomething> d;  // but this doesn't}
--
None of the compilers had a problem when the last code line was
commented out.
Is this a language "feature" or a surprisingly common bug?
But the code works on MSVC6.0
By the way, D ctor should be public
change B to the following, then the code works on ICC 9.1 and MSVC 8.0
class B : public A {
public:
    virtual void doSomething() = 0;
}; // extended interface
My humble explanation is that non-type template parameter does not
allow implicit type conversion
-- 
      [ See http://www.gotw.ca/resources/clcm.htm for info about ]
      [ comp.lang.c++.moderated.    First time posters: Do this! ]