开发者

"no matching function for call to" HAS ME BAFFLED

I'm back again with this PCNN code from a text book.

I'm getting the "no matching function call for" error in pcn2d.cc in lines associated

with variables F, L, U, T, and Y. Here are the class files, the code file, and the compiler log:

rimage.h

    //
    // rimage.h  
    //  
    //  
    // Jason M. Kinser  
    // 15 October 1995  
    // rimage.h  
    // an image of real elements  
    // 1 April 1996 - added histogram  
    // 15 April 1996 - addeed hgradientbox  
    // 27 June 1996 - a dded /= rimage  
    // 7 July 1996 - added / rimage, Smooth  
    //  
        #include "matrix.h"  
        #ifndef RIMAGE    
        #define RIMAGE  
        typedef unsigned short word;    
        typedef unsigned long dword;  

        class rimage : public matrix {  
    public:  
        rimage( void );  
        rimage( int, int );  
        rimage( rimage & );  
        rimage & operator=( const matrix & A );  
        rimage & operator=( const rimage & A );  
        rimage & operator/=( int );  
    // Math  
        rimage operator+( float );  
        rimage operator+( const rimage & );  
        rimage operator*( const rimage & ); // element  
        rimage operator*( float );  
        friend rimage operator+( float, const rimage & );  
        friend rimage operator*( float, const rimage & );  
        rimage Convolve( rimage & );  
    // Image conversions  
        void UpsideDown( void );  
    // Input / Output  
        void SaveTarga( char * );  
    } ;  
    #endif  

pcnn2d.h

    //  
    // pcnn2d.h  
    // A 2D Pulse-Coupled Neural Network  
    // Jason Kinser  
    // 15 April 1996  
    //  
    #include "rimage.h "  
    class PCNN {  
    int vert, horz;  
    rimage Quantized ( void );  
    public:  
         rimage F, L, U, T, Y, K;  
         float af, al, at, beta, vf, vl, vt;  
         PCNN( int, int);       // The two dimensions  
         PCNN( const PCNN & );  // copy  
         ~PCNN( void );  
    int KernVert( void) const;   
    int KernHorz( void) const;  
    void StdK( void );  
    int Iterate ( rimage & );  
    int FastIterate( rimage & ); // uses fast linking   
    void Clear( void );  
    void Save( char * );  
    void Load( char * );  
    };  

pcnn2d.cc

    //  
    // pcnn2d.cc  
    // The Pulse-Coupled Neural Network  
    //  
    // Jason Kinser  
    // 15 April 1996  

    #include <math.h>  
    #include <stdlib.h>  
    #include "pcnn2d.h"  

    PCNN::PCNN( int V, int H )  
    {  
        vert = V;   horz = H;  
        F.New( V, H );  
        L.New( V, H );  
        U.New( V, H );  
        T.New( V, H );  
        Y.New( V, H );  
        K.New( 5, 5 );  
        af = 10.0; al = 1.0; at = 5.0;  
        beta = 0.1;  
        vf = 0.5;   vl = 0.5;   vt = 20.0;  
        StdK();  
    }  

    PCNN::PCNN( const PCNN & P )
    {
        vert = P.vert; horz = P.horz;
        F.New( vert, horz );
        L.New( vert, horz );
        U.New( vert, horz );
        T.New( vert, horz );
        Y.New( vert, horz );
        K.New( P.KernVert ( ), P.KernHorz( ) );
        F = P.F;    L = P.L;        U = P.U;
        T = P.T;    Y = P.Y;        K = P.K;
        af = P.af; al = P.al;   at = P.at;
        beta = P.beta;
        vf = P.vf; vl = P.vl; vt = P.vt;
    }
    PCNN::~PCNN( void )
    {
        F.Dispose();    L.Dispose();    U.Dispose();
        T.Dispose();    Y.Dispose();    K.Dispose();
    }

    int PCNN::KernVert( void ) const
    // returns the vertical dimension of the kernel
    {   return K.Vert( ); }

    int PCNN::KernHorz( void ) const
    {   return K.Horz( ); }

    void PCNN::StdK( void )
    {   int i, j, kv, kh; float val;
        kv = K.Vert(); kh = K.Horz();
        for ( i=0; i<kv; i++ ) for ( j=0; j<kh; j++ ) 
        {
            val = hypot( i-kv/2, j-kh/2 );
            if( val != 0.0 ) val = 1.0/val;
            else val = 1.0;
            K[i][j] = val;
        }
    }
    rimage PCNN::Quantized ( void )
    {
        int i,j; rimage ans( vert, horz );
        rimage work( vert, horz ), k( 3,3 );
        k.Clear( 1.0 ); 
        work = Y.Convolve( k );     //ERROR LINE 74
    for ( i=0; i<work.Vert(); i++ ) for ( j=0; j<work.Horz(); j++ )
        if( work[i][j] > 1.0 ) ans[i][j] = 1.0;
        else ans [i][j] = 0.0;
    return ans;
    }
    int PCNN::Iterate( rimage & A )
    {
        rimage work( F.Vert() , F.Horz() );
        work = Y.Convolve( K );              //ERROR LINE 83
        F = exp( -1.0/af ) * F + vf * work + A; //ERROR LINE 84
        L = exp( -1.0/al ) * L + vl* work;  //ERROR LINE 85
        U = F * (1.0 + beta * L);           //ERROR LINE 86
        for( int i=0; i<vert; i++ ) for ( int j = 0; j<horz; j++ )
            if( U[i][j] > T[i][j] )
            Y[i][j] = 1.0;
            else
            Y[i][j] = 0.0;
        T = exp ( -1.0/at ) * T + vt * Y;   //ERROR LINE 92
        return int( Y.Sum( ) );
    }
    int PCNN::FastIterate( rimage & A )
    {
        rimage work ( F.Vert(), F.Horz()), Q ( F. Vert () , F.Horz ());
        int n=0;
        if( vf != 0 ) work = Y.Convolve( K );   //ERROR LINE 99
        F = exp( - 1.0/af ) * F + vf * work + A;    开发者_如何学Python//ERROR LINE 100
        Y.Clear();
        do {
            Q = Y; n++;
            L = Quantized( );       //ERROR LINE 104
            U = F * (1.0 + beta * L);   //ERROR LINE 105
            for( int i=0; i<vert; i++ ) for( int j=0; j<horz; j++ )                 
            if( U[i][j] > T[i][j] )
            Y[i][j] = 1.0;
        } 
        while( (Q + Y).Sum() > 1 && n < 5);
        T = exp( -1.0/at ) * T + vt * Y;    //ERROR LINE 111
        return int ( Y.Sum( ) );
    }

The compiler log:

g++.exe -c "PCNN Code/pcnn2d.c" -o   
"PCNN Code/pcnn2d.o" -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"    
-I"C:/Dev-Cpp/include/c++/3.4.2/backward"    
-I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"    
-I"C:/Dev-Cpp/include/c++/3.4.2"  
-I"C:/Dev-Cpp/include"     


In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31,  
                 from PCNN Code/vector.h:9,  
                 from PCNN Code/matrix.h:10,  
                 from PCNN Code/rimage.h :15,  
                 from PCNN Code/pcnn2d.h:8,  
                 from PCNN Code/pcnn2d.c:12:  
C:/Dev-Cpp/include/c++/3.4.2/backward/backward_warning.h:32:2:   
warning: #warning This file includes at least one deprecated or antiquated header.   
Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard.   Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.  
PCNN Code/pcnn2d.c: In member function `rimage PCNN::Quantized()':  
PCNN Code/pcnn2d.c:74: error: no matching function for call to `rimage::rimage(rimage)'  
PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  

PCNN Code/pcnn2d.c: In member function `int PCNN::Iterate(rimage&)':  
PCNN Code/pcnn2d.c:83: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:84: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:84: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:85: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:85: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:86: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:86: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:86: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:92: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:92: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c: In member function `int PCNN::FastIterate(rimage&)':  
PCNN Code/pcnn2d.c:99: error: no matching function for call to `rimage::rimage(rimage)'  
PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:100: error: no matching function for call to `rimage::rimage(rimage)'  
PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:100: error: no matching function for call to `rimage::rimage(rimage)'  
PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:104: error: no matching function for call to `rimage::rimage(rimage)'  
PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:105: error: no matching function for call to `rimage::rimage(rimage)'  
PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:105: error: no matching function for call to `rimage::rimage(rimage)'  
PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:105: error: no matching function for call to `rimage::rimage(rimage)'  

PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:111: error: no matching function for call to `rimage::rimage(rimage)'  
PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  
PCNN Code/pcnn2d.c:111: error: no matching function for call to `rimage::rimage(rimage)'  
PCNN Code/rimage.h :27: note: candidates are: rimage::rimage(rimage&)  

make.exe: *** ["PCNN Code/pcnn2d.o"] Error 1  
Execution terminated


It talks about not exactly matching a call to rimage::rimage(rimage&). This usually means that you are trying to copy from a temporary object, which could use this copy constructor if it had been rimage::rimage(const rimage&).

Why is it not? Because the code is 15 years old, from before there was a C++ standard?


yup - your copy constructor must be rimage(const rimage& other) -- note the additional const.

ms's compiler supported this as an extension, for some reason.

with the const in place, a conforming compiler will be allowed (by the standard) to create/use a temporary rimage instance, unless there is a conversion and you have declared the constructor explicit.

solution: you will either have to

1) provide a copy constructor which uses a const qualifier for its argument

2) or explicitly create a non-const rimage instance and pass that for copy.

which is better/applicable depends on the actual implementation, and in some cases, the costs/side-effects of enabling copying.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜