質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1131閲覧

自作ヘッダファイルのインクルード位置

Tteratail

総合スコア36

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/10/12 15:16

c++にて、自作ヘッダファイルの挿入位置によって、g++コンパイル時になぜかメンバ関数がいないとエラーになります。

DateMain.cpp:12:13: error: ‘const class Date’ has no member named ‘preceding_day’ Date b = a.preceding_day();

以下がソースで、Date.hでDateクラスを実装していて、Date.cppでDate.hをインクルードしてますが、
このインクルードする位置によってエラーになる/ならない変わってきます。★印がエラーになる位置とならない位置を指し示しています。
別に自作ヘッダファイルは標準ヘッダの前でも後ろでも問題ないという認識なんですが。。
すみません、理由が分かれば教えて頂きたいです。

c++

1------ Date.h ------- 2#include <ctime> 3class Date 4{ 5 int year_; 6 int month_; 7 int date_; 8 mutable int counter; 9public: 10 Date(int year, int month, int date): 11 year_{year}, 12 month_{month}, 13 date_{date} 14 {} 15 16 int get_year() const {return year_;} 17 int get_month()const {return month_;} 18 int get_date() const {return date_;} 19 Date preceding_day() const 20 { 21 //Month 1 2 3 4 5 6 7 8 9 10 11 12 22 int dmax[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 23 Date tmp = *this; 24 if(tmp.date_ > 1) //日付が2日以上なら単純に1日減らす 25 tmp.date_--; 26 else //日付が1日なら、1つ前の月の31日にする 27 { 28 if(--tmp.month_ < 1) //1月なら、1つ前の年の12月にする 29 { 30 tmp.year_--; 31 tmp.month_ = 12; 32 } 33 34 tmp.date_ = dmax[tmp.month_ - 1]; 35 } 36 return tmp; 37 } }; 38---------------------------- 39 40----- Date.cpp ------------ 41#include "Date.h" <--- ★ コンパイルエラーが出るヘッダ位置 42#include <iostream> 43#include "Date.h" <--- ★ コンパイルが通るヘッダ位置 44 45using namespace std; 46 47 int main(int argc, char* argv[]) 48 { 49 const Date a(2020, 10, 11); 50 cout << "a:" << a.get_year() << a.get_month() << a.get_date() << endl; 51 52 Date b = a.preceding_day(); 53 cout << "A day before a:" << b.get_year() << b.get_month() << b.get_date() << endl; 54 return 0; 55 } 56--------------------------

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mjk

2020/10/12 15:38

https://paiza.io/projects/xhiVx0NdNZjaeo0dPLN_fA }が1つ足りない、}の後に;が無いなどのエラーは出ましたが、 それを修正したら質問の#include "Date.h"の位置に関わらず動作しているようです。
Tteratail

2020/10/12 20:22

> }が1つ足りない、}の後に;が無いなどのエラーは出ましたが、 コピペする際にミスったかもしれません。 > "Date.h"の位置に関わらず動作しているようです。 確認していただきありがとうございます。そうでしたか…もう一度自分のコードを確認してみます。
stdio

2020/10/12 21:05

すみません。 私の手元にあるvisual studio 2017で試しても再現は出来ませんでした。 何が原因なんでしょうね。私もそういうエラー初めです。
maisumakun

2020/10/12 22:59

Date.hの中で<iostream>の何かを使っていたりはしませんか?
Tteratail

2020/10/17 07:00

Date.hの中には<ctime>しかインクルードしてませんでした。
guest

回答2

0

DateMain.cpp:12:13: error: ‘const class Date’ has no member named ‘preceding_day’ Date b = a.preceding_day();

以下がソースで、Date.hでDateクラスを実装していて、Date.cppでDate.hをインクルードしてますが、

Date.cpp ではなく、DateMain.cpp をコンパイルしているからではありませんか?

投稿2020/10/12 18:07

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tteratail

2020/10/12 20:19

あ、すみません、実際はDate.hとDateMain.cppなんですが、ここに転記する際にファイル名をDate.cppに修正しただけです(紛らわしいことしてすみません)
guest

0

ベストアンサー

https://wandbox.org/permlink/0ZEwpgQobkYpkaB5

そのままコピペしてみましたが再現しません。

classの{}の対応とかクラスの}のあとの;忘れとかそういう凡ミスだったりしないですか

投稿2020/10/12 15:23

yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tteratail

2020/10/12 20:36

Wandboxで確認頂いてありがとうございます。 再現しませんでしたか…もう一度自分のコードと環境確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問