Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

whats wrong with the default parameters?

Tags:

c++

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 " << streamDescription << "." );

    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.

like image 815
RidaSana Avatar asked May 15 '11 09:05

RidaSana


2 Answers

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!

like image 132
Nawaz Avatar answered Sep 23 '22 02:09

Nawaz


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.

like image 21
Alok Save Avatar answered Sep 22 '22 02:09

Alok Save