【问题标题】:whats wrong with the default parameters?默认参数有什么问题?
【发布时间】:2011-05-15 09:05:16
【问题描述】:

我有这个函数声明和定义..

定义


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 );


}

声明


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);

主要


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;
}

类定义

命名空间声音数据{

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


}

} // 命名空间声音数据

错误


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

它有什么问题?我只加载一个文件,所以argc 应该是 1。但是为什么会导致错误呢?

还请告诉我应该怎么做才能读取参数(int argc, char* argv[])main()

我想我没听懂。

【问题讨论】:

  • 现在告诉我关于loadFrom的故事?是无静电功能吗?或者它是班级成员还是什么?
  • 我觉得非常令人沮丧的是,在编辑后的帖子中,错误与loadFrom 函数有关,但您没有发布它的定义。以及它的定义。什么都没有!
  • @Nawaz:这里的 loadFrom 既不是静态函数也不是类的成员。它只是一个非静态函数,...你说得对,我没有添加 laodFrom 函数...

标签: c++


【解决方案1】:

仅在声明中提及参数的默认值:

//declaration  with default parameter
void loadFromFile( string const& fileName, 
                   Frames& frames, 
                   ostream& log =std::clog);

不要在定义中提及默认值:

//definition
void loadFromFile( string const& fileName, 
                   Frames& frames, 
                   ostream& log) 
{
     //....
}

现在完美了。现在应该可以编译了!

【讨论】:

  • @Miss:这可能是语言的设计方式吧?如果你想研究这个,那就去买一本 C++ 标准书吧。
  • @Miss:关于默认参数还有一个有趣的故事。看到这个:Default argument in the middle of parameter list?
  • @Miss:也许,那本书不包含这些信息。另外,我不仅说C++ book。我说C++ Standard
  • @Miss:loadFromFile是类的非静态成员函数吗?
  • @Miss:你把一切都搞砸了。 loadFromFile 不是任何类的成员。删除 static 关键字其定义,因为 static 表示该函数仅在该文件中可见。不能从任何其他源文件调用它。
【解决方案2】:

正如其他答案中已经提到的,

错误原因:
错误的原因是您在函数定义中提到了默认值参数。它们应该只在函数声明中提及,而不应在定义中提及。

回答你的第二个问题。
请告诉我我应该为 main() 中的参数 (int argc, char argv[]) 读什么?*

argc => 提供给程序的参数数量(包括程序)
argv => 一个指向字符串的指针数组,这些字符串是提供给程序的参数——它的类型是“指向 char 的指针数组”

这些参数由主机系统的命令行解释器或作业控制语言传递给程序。

您可以阅读 this 以了解将参数传递给 main。

【讨论】:

  • 所以我只需要加载一个输入,我认为 argc 应该等于 1。而 argv(1) 将得到一个作为数组元素.. 对吗?
  • @Miss: argv 中的第一个元素总是程序本身的名称,所以 argc 总是至少为 1,argv[0] 是你的程序的名称,然后是其他参数传递给程序。
  • 让我先研究一下那个链接,然后我会看到主要的 arg 问题 ..感谢那个链接
【解决方案3】:

在你的loadFromFile 函数定义中你应该写

void loadFromFile( string const& fileName, Frames& frames, ostream& log) {/*...*/}

您不应在函数定义中指定默认参数值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多