我从教科书中再次使用此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
答案 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
实例并将其传递给副本。
更好/适用取决于实际实施,在某些情况下,还取决于启用复制的成本/副作用。