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.
精彩评论