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--------------------------
https://paiza.io/projects/xhiVx0NdNZjaeo0dPLN_fA
}が1つ足りない、}の後に;が無いなどのエラーは出ましたが、
それを修正したら質問の#include "Date.h"の位置に関わらず動作しているようです。
> }が1つ足りない、}の後に;が無いなどのエラーは出ましたが、
コピペする際にミスったかもしれません。
> "Date.h"の位置に関わらず動作しているようです。
確認していただきありがとうございます。そうでしたか…もう一度自分のコードを確認してみます。
すみません。
私の手元にあるvisual studio 2017で試しても再現は出来ませんでした。
何が原因なんでしょうね。私もそういうエラー初めです。
Date.hの中で<iostream>の何かを使っていたりはしませんか?
Date.hの中には<ctime>しかインクルードしてませんでした。
回答2件
あなたの回答
tips
プレビュー