Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No legal conversion to 'this' pointer

Tags:

c++

templates

Please take a look at this code and run it:
I'm getting very strange error:
Error 1 error C2663: 'Allocator::allocate_help' : 2 overloads have no legal conversion for 'this' pointer

template<class FailureSignal>
class Allocator
{
private:
    template<class Exception,class Argument>
    void allocate_help(const Argument& arg,Int2Type<true>)
    {
    }

    template<class Exception,class Argument>
    std::nullptr_t allocate_help(const Argument& arg,Int2Type<false>)
    {
        return nullptr;
    }

public:
    template<class T>
    void Allocate(signed long int nObjects,T** ptr = 0)const
    {
    allocate_help<std::bad_alloc>(1,Int2Type<true>());  
    }

};

int _tmain(int argc, _TCHAR* argv[])
{
    Allocator<int> all;
    all.Allocate<int>(1);
    return 0;
}  

I absolutely do not understand this err msg. Hope someone can help me with this. Thank you.

like image 371
There is nothing we can do Avatar asked Nov 30 '10 19:11

There is nothing we can do


2 Answers

I noticed Allocate is declared const but allocate_help is not - could that be related to the issue?

like image 169
fbrereto Avatar answered Nov 13 '22 09:11

fbrereto


I had the same error which was also caused by const but in a bit different way.

I have two virtual functions (overloads), one was const and the other was not. This was causing the problem. Turns out if you want to overload a function, they both need to match if they are const or not.

virtual void value() const = 0;
virtual void value(MyStruct & struct) = 0;

The above code will cause this error. The fix is to change declaration of 2nd to:

virtual void value(MyStruct & struct) const = 0;
like image 38
zar Avatar answered Nov 13 '22 09:11

zar