whats wrong with the default parameters?
I have this function declaration and definition..
definition
void loadFromFile(
string const& fileName,
Frames& frames,
ostream& log =std::clog
)
{
using std::endl;
using std::ifstream;
string const streamDescription = "text data file " + fileName;
log << "Opening " << streamDescription << " for reading..." << endl;
ifstream stream( fileName.c_str() );
(!stream.fail())
|| throwX( S() << "Error opening " << streamDe开发者_开发百科scription << "." );
loadFrom( stream, frames, streamDescription, log );
}
declaration
void loadFrom(
istream& stream,
Frames& frames,
string const& streamName = "a text stream",
// ostream should also have default parameter as streamName
ostream& log =std::clog); //std::clog create an object for ostream
void loadFromFile(
string const& fileName,
Frames& frames,
ostream& log =std::clog);
Main
void cppMain( int argc, char const* const argv[] )
{
(argc == 1) || throwX( S()
<< "Usage: "
<< argv[0] << " <file1.txt>"
);
soundData::Frames testFrames;
soundData::loadFromFile( argv[0], testFrames );
// doTimeWarping( templateFrames, testFrames );
cout << "Done." << endl;
}
int main (int argc, char* argv[])
{
try
{
cppMain( argc, argv );
return EXIT_SUCCESS;
}
catch( exception const& x )
{
cerr << "!" << x.what() << endl;
}
return EXIT_FAILURE;
}
class defination
namespace soundData{
//-------------------------- FeatureVector:
int FeatureVector::count()const
{
return values_.size();
}
double FeatureVector::operator[](int i)const
{
return element(i, values_);
}
FeatureVector::FeatureVector( int n )
: values_( n )
{}
/*==================Frame====================================*/
Frame::Frame( int nFeatures )
: features( nFeatures )
{}
/*===================Frames==========================*/
int Frames::count() const
{
return frames_.size();
}
int Frames::nFeaturesPerFrame() const
{
return nFeaturesPerFrame_;
}
Frame const& Frames::operator[]( int i ) const
{
return element( i, frames_ );
}
Frames::Frames( int n )
: nFeaturesPerFrame_( n )
{}
/*============loading the frames ===============*/
void loadFromFile( string const& fileName, Frames& frames, ostream& log)
{
using std::endl;
using std::ifstream;
string const streamDescription = "text data file " + fileName;
log << "Opening " << streamDescription << " for reading..." << endl;
ifstream stream( fileName.c_str() );
(!stream.fail())
|| throwX( S() << "Error opening " << streamDescription << "." );
loadFrom( stream, frames, streamDescription, log );
}
} // namespace sounddata
error
Error 1 error C2572: 'soundData::loadFromFile' : redefinition of default parameter : parameter 3 c:lacture\loading frames\loading frames\sounddata.cpp 111 1 loading frames
Error 2 error LNK2019: unresolved external symbol "void __cdecl soundData::loadFrom(class std::basic_istream<char,struct std::char_traits<char> > &,class soundData::Frames &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_ostream<char,struct std::char_traits<char> > &)" (?loadFrom@soundData@@YAXAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAVFrames@1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@3@AAV?$basic_ostream@DU?$char_traits@D@std@@@3@@Z) referenced in function "void __cdecl soundData::loadFromFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class soundData::Frames &,class std::basic_ostream<char,struct std::char_traits<char> > &)" (?loadFromFile@soundData@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAVFrames@1@AAV?$basic_ostream@DU?$char_traits@D@std@@@3@@Z) C:\loading frames\soundData.obj loading frames
What's wrong with it? I am loading only one file, so argc
should be 1. But then why is that resulting in an error?
Please also tell me what I should do to read the parameters (int argc, char* argv[])
in main()
.
I think i did not understand it.
Mention the default value for the parameter in the declaration ONLY:
//declaration with default parameter
void loadFromFile( string const& fileName,
Frames& frames,
ostream& log =std::clog);
Don't mention the default value in the definition:
//definition
void loadFromFile( string const& fileName,
Frames& frames,
ostream& log)
{
//....
}
Now its perfect. It should compile now!
As already mentioned in other answers,
Error Cause:
The cause of the error is that you have mentioned default value arguments in definition of the function. They should be only mentioned in the function declaration and not the definition.
To answer your second question.
please tell me what should i read for parameters (int argc, char argv[]) in main()?*
argc => The number of arguments supplied to the program (the program included)
argv => An array of pointers to the strings which are the arguments supplied to program—its type is ‘array of pointer to char’
These arguments are passed to the program by the host system's command line interpreter or job control language.
You can read this to understand passing arguments to main.
In your loadFromFile
function definition you should write
void loadFromFile( string const& fileName, Frames& frames, ostream& log) {/*...*/}
You shouldn't specify default paramater value in function definition.
精彩评论