“没有匹配的功能来呼叫”HAS ME BAFFLED

时间:2011-03-18 06:07:06

标签: c++

我从教科书中再次使用此PCNN代码 我在pcn2d.cc中的相关行中得到“无匹配函数调用”错误 使用变量F,L,U,T和Y.以下是类文件,代码文件和编译器日志:

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;    //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( ) );
    }

编译器日志:

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

2 个答案:

答案 0 :(得分:2)

它谈到的不完全匹配对rimage::rimage(rimage&)的调用。这通常意味着您尝试从临时对象进行复制,该临时对象可以使用此复制构造函数如果它是rimage::rimage(const rimage&)

为什么不呢?因为代码是15年,从之前有一个C ++标准?

答案 1 :(得分:0)

是 - 您的副本构造函数必须为rimage(const rimage& other) - 请注意其他const

ms的编译器出于某种原因支持将其作为扩展名

const到位的情况下,将允许符合标准的编译器(通过标准)创建/使用临时rimage实例,除非有转换且您已声明构造函数{{ 1}}。

解决方案:您必须

1)提供一个复制构造函数,它使用const限定符作为其参数

2)或显式创建一个非const explicit实例并将其传递给副本。

更好/适用取决于实际实施,在某些情况下,还取决于启用复制的成本/副作用。