C++ 如何解决声明错误

C++ 如何解决声明错误,c++,scope,compilation,declaration,stdstring,C++,Scope,Compilation,Declaration,Stdstring,我试图运行一个代码,需要用户输入的标准时间,并将其转换为军事时间。对于用户输入,小时数可以键入一位或两位数字,AM/PM可以以任何方式键入。因此,我的守则如下: #include <iostream> #include <string> using namespace std; string time, hour, minute, amPm, miltime; char amPmCheck; int main() { cout<<"Enter

我试图运行一个代码,需要用户输入的标准时间,并将其转换为军事时间。对于用户输入,小时数可以键入一位或两位数字,AM/PM可以以任何方式键入。因此,我的守则如下:

#include <iostream>
#include <string>

using namespace std;

string time, hour, minute, amPm, miltime;

char amPmCheck;

int main()
{

    cout<<"Enter time:\n";

    cin>>time;

    colon = time.find(':');

    space = time.find (' ');

    hour = time.substr(0, colon);

    minute = time.substr(colon + 1, space);

    amPm = time.substr(space, back);

    amPmCheck = amPm[0];

    timeConversion(hour, minute, amPmCheck);

    return 0;
}


void timeConversion(hour, minute, amPmCheck)
{
    if(amPmCheck == 'a'||'A')
    {
        if(int(hour) == 12)
        {
            hour.assign('00');
        }
        else if (int(hour) <= 9)
        {
            hour.insert(0, '0');
        }
    }
    else
        if(int(hour) < 12)
        {
            hour.assign(12+int(hour));
        }

    miltime = hour + minute

    cout<< "Corresponding military time is", miltime;
}

我对编程还比较陌生,因此,如果您能提供我的错误是什么以及最简单的修复方法,我将不胜感激。

这里有几个问题,首先:

  • 改变
void timeConversion(小时、分钟、安培检查)

void timeConversion(字符串和小时、字符串和分钟、字符串和amPmCheck)

如果你想处理函数参数

  • 或者将相同的功能(在您的情况下为更好的选项)更改为:
void timeConversion()

因为您正在处理全局变量

  • timeConversion
    函数置于
    main
    之前,或使用如下预声明:
void timeConversion()

也在
main
功能之前


请阅读关于C++的好书。

初学者不必声明这些变量为命名空间变量。< /P>

string time, hour, minute, amPm, miltime;

char amPmCheck;
如果函数
main
,则应将它们声明为局部变量

并且没有变量
冒号
空格
的声明

此声明

amPm = time.substr(space, back);
没有道理。变量
amPm
被声明为具有类型
char
,而不是类型
std::string

函数声明

void timeConversion(hour, minute, amPmCheck)
这是错误的。您没有指定函数参数的类型

像这样的声明

    if(int(hour) == 12)
没有道理。您必须至少使用标准函数
std::stoi
std::string
类型的对象转换为
int
类型的对象

在声明中

hour.assign('00');
hour.insert(0, '0');
hour.assign(12+int(hour));
使用了多字节字符文本。看来你的意思是双引号

hour.assign("00");
这同样适用于该语句

hour.assign('00');
hour.insert(0, '0');
hour.assign(12+int(hour));
此声明

hour.assign('00');
hour.insert(0, '0');
hour.assign(12+int(hour));
也没有道理

代码中的错误太多

您应该首先阅读类
std::basic_string
的文档,了解如何使用它的方法

不要用嘲弄的语言

using namespace std;
这可能是冲突声明错误的原因。 例如,请参见编译器的错误消息

main.cpp:15:8: error: 'std::string time' redeclared as different kind of symbol
 string time, hour, minute, amPm miltime;
        ^~~~
In file included from /usr/include/pthread.h:24:0,
                 from /usr/include/x86_64-linux-gnu/c++/6/bits/gthr-default.h:35,
                 from /usr/include/x86_64-linux-gnu/c++/6/bits/gthr.h:148,
                 from /usr/include/c++/6/ext/atomicity.h:35,
                 from /usr/include/c++/6/bits/ios_base.h:39,
                 from /usr/include/c++/6/ios:42,
                 from /usr/include/c++/6/ostream:38,
                 from /usr/include/c++/6/iostream:39,
                 from main.cpp:10:
/usr/include/time.h:192:15: note: previous declaration 'time_t time(time_t*)'
 extern time_t time (time_t *__timer) __THROW;
               ^~~~

在命名空间
std

中声明的标准名称使用限定名称,您需要在此处输入参数的类型
void timeConversion(小时、分钟、amPmCheck)
并将整个函数定义移动到
main()
之前。您应该得到一个。这将大大加快您的学习进度。
string time
time
重命名为其他内容。名称
time
已被占用。例如,使用<代码> TimeSTR< <代码>。请学习C++的类型系统。编译器实际上告诉你正在发生的事情:<代码> STD::字符串时间“重新声明为不同类型的符号< /代码>,后面是前一个声明“TimeTyt时间(TimeTy*)”< /C>。因此,标识符
时间
已经用于其他目的。以后,请仔细阅读编译器错误消息。它们过去非常神秘,但现代编译器在这方面做得更好。