我有三个文件Date.cpp,program.cpp和Date.h如下:
Date.h:
struct Date{
int mm, dd, yy;
void display();
};
Date.cpp
#include "Date.h"
#include <iostream>
using namespace std;
void Date::display()
{
string m[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
cout << m[mm-1] << ' ' << dd << ", " << yy<<endl;
}
program.cpp:
#include "Date.h"
#include <iostream>
using namespace std;
int main
{
Date today = {7,1,1867};
cout << "Today is ";
today.display();
return 0;
}
当我尝试使用编译时:
g++ Date.cpp program.cpp -o Date
我收到一大堆抱怨program.cpp的错误,例如:
extended initializer lists only available with -std=c++11 or -std=gnu++11{enabled by default].
expected '}' before 'today'.
expected ',' or ';' before 'today'.
'cout' does not name a type.
'today' does not name a type.
expected unqualified-id before 'return'.
expected declaration before '}' token.
任何帮助解决这些错误都将不胜感激,谢谢
答案 0 :(得分:3)
导致错误的原因是您不能以尝试构造Date对象的方式使用初始化列表,除非您使用-std=c++11
标志编译程序。
更改
Date today = {7,1,1867};
到
Date today;
today.dd = 7;
today.mm = 1;
today.yy = 1867;
或为Date类提供构造函数
struct Date{
Date( int m, int d, int y) : mm( m ), dd( d ), yy( y ) {}
int mm, dd, yy;
void display();
};
并像往常一样使用它:Date today(7,1,1867);
答案 1 :(得分:1)
编译-std=c++11
编译Date today = {7,1,1867};
而且你的标题中可能需要#pragma once
(或ifndef
包括守卫) - 虽然这在你特定的情况下并不重要(假设你展示了整个事情)。
答案 2 :(得分:1)
尝试通过构造函数初始化对象:
struct Date{
int mm, dd, yy;
Date( int _mm, int _dd, int _yy ) : mm( _mm ), dd( _dd ), yy( _yy ) {}
void display();
};
在你的主体,
Date today( 7,1,1867 );
另外,正如所指出的,C ++ 11支持数组的初始化列表,因此您需要为编译器设置适当的标志。
编辑:
此外,在访问m[mm-1]
之前,您应该检查mm是否<= 12 。
答案 3 :(得分:1)
您提供的代码存在多个错误,以及您可以采取的一些措施来改进它。
首先修复你的主要内容:
int main() // put the opening and closing parenthesis after 'main'
{
Date today = {7,1,1867};
cout << "Today is ";
today.display();
return 0;
}
接下来,确保您的头文件具有正确的标题保护:
#ifndef DATE_H
#define DATE_H
struct Date{
int mm, dd, yy;
void display();
};
#endif /* DATE_H */
您可以在此处详细了解这些标题保护的用途:http://en.wikipedia.org/wiki/Include_guard
接下来,您需要为Date
类提供构造函数。
Date( int mm, int dd, int yy);
你的许多问题都是文体问题,但遵守这些标准非常重要。
答案 4 :(得分:1)
现在,您正在尝试使用聚合初始化,但是(因为它包含成员函数)Date
不是聚合。
C ++ 11添加了初始化列表,这将允许您使用相同的语法,但您使用的编译器显然要求您在允许之前明确启用C ++ 11功能。
我在这里看到四种选择。一个是错误消息建议:启用C ++ 11功能,并享受乐趣。第二个是向ctor
类添加Date
,并使用括号而不是大括号括起初始化列表:
struct Date {
int mm, dd, yy;
Date(int mm, int dd, int yy) : mm(mm), dd(dd), yy(yy) {}
};
// ...
Date today = Date(8, 1, 1867);
在这种情况下,第三种(也许是迄今为止最好的)替代方案是摆脱display
成员函数,而不是重载operator<<
,所以你的Date
类 是一个聚合,你将能够像你想要的那样使用聚合初始化:
struct Date {
int mm, dd, yy;
};
std::ostream &operator<<(std::ostream &os, Date const &d) {
static const string m[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
os << m[mm-1] << ' ' << dd << ", " << yy;
}
然后,您将能够使用普通的C ++惯用语来初始化和显示日期对象:
Date d = {8, 1, 1867};
cout << d << "\n";
最后的选择是自己跳过定义任何,并使用标准库中内置的日期和时间功能。 struct tm
已经提供了日,月和年的字段,strftime
(以及其他)支持根据您的选择格式化日期/时间(不仅包括月份的缩写名称,还包括基于a的本地化名称)选择的区域设置,如果您选择)。