函数不带0个参数

时间:2017-01-26 18:59:58

标签: c++ function arguments

uppercase()函数是我的类的一部分:

class MyString {
public:
    MyString();
    MyString(char cstring[]);
    void uppercase();

private

};

大写的实现尚未完成,但看起来像这样:

void MyString::uppercase()
{
    cout << "need to implement";
}

当我调用该函数时,它看起来像这样:

//Output streaming Operator Overload
ostream& operator<<(ostream& os, const MyString& string)
{
    if (MyString::printAsUppercase == true)
        uppercase();
    else
        os << string.data;

    cout << "(" << string.length << ")";
    return os;

}

当我尝试编译代码时,收到以下错误:

'std::uppercase': function does not take 0 arguments

我真的不明白这一点,因为我宣布原型不接受任何论证,并在实施中继续执行。该函数不应该采用任何参数。为什么会这样?

3 个答案:

答案 0 :(得分:1)

std::uppercase是标准库中的合法I / O流对象。因为您在std命名空间中编码,所以编译器无法判断您是使用函数还是库对象。一个简单的解决方案是更改函数的名称或指定类MyClass :: uppercase(...)。更好的解决方案是将代码包装在您自己的命名空间中,或者使用声明“using namespace std;”避免在std命名空间中编码。在我看来,每次使用时都更明确地指定std命名空间。例如,而不是写“using namespace std;”然后“cout&lt;&lt; ...”只写“std :: cout&lt;&lt; ...”

答案 1 :(得分:0)

您需要指定要调用大写方法。 错误表明您要调用“std :: uppercase”&lt;&lt; std ::你需要在课堂上调用你的方法。

评论编辑: FrançoisAndrieux提到这可能是一个问题,因为你使用“using namespace std;” 因此,将在std中搜索所有函数调用。 (并且他是正确的:))

答案 2 :(得分:0)

我希望以下代码可以帮助理解其他用户指出的要点。它编译,但......绝对不是最佳:

main.cpp

#include <iostream>
#include "MyString.h"

int main(int argc, char** argv)
{
   // Needs arguments from command line!!!
   MyString teststring(argv[1]);
   std::cout << teststring << std::endl;
   return 0;
}

MyString.h

class MyString {
public:
   MyString();
   MyString(char *cText);
   void myUpperCase();
   int myStringLenght();

protected:
   bool printAsUppercase;
   char *data;
   friend std::ostream& operator<<(std::ostream& os, 
                                    MyString mystring);
};

MyString.cpp

#include <cstdlib>
#include <cstring>
#include <iostream>
#include "MyString.h"

MyString::MyString(char *cText)
{
   data = (char *)std::malloc(strlen(cText));
   std::strcpy(data, cText);
}

void MyString::myUpperCase()
{
   std::cout << "not yet implemented";
}

int MyString::myStringLenght()
{
   return int(strlen(data));
}

std::ostream& operator<<(std::ostream& os, 
                           MyString mystring)
{
   // to be deleted - only for testing
   mystring.printAsUppercase = true;

   if (mystring.printAsUppercase == true)
      mystring.myUpperCase();
   else
      os << mystring.data;

   std::cout << "(" << mystring.myStringLenght() << ")";
   return os;
}