環境
- C++11
- Visual Studio 2017
- gcc version 5.4.0
内容
下記のような親子関係があるテンプレートクラスを Curiously Recurring Template Pattern で作りました。
cpp
1#include <iostream> 2 3// 親クラス 4template <class Child, class SomeType> 5struct Base 6{ 7 void interface() 8 { 9 static_cast<Child *>(this)->implementation(); 10 } 11 12 void set_value(SomeType value) 13 { 14 member_ = value; 15 } 16 17 public: 18 SomeType member_; 19}; 20 21// 子クラス 22template <class SomeType> 23struct Derived : Base<Derived<SomeType>, SomeType> 24{ 25 void implementation() 26 { 27 std::cout << member_ << std::endl; 28 } 29}; 30 31int main(int argc, char *argv[]) 32{ 33 Derived<int> obj; 34 obj.set_value(1); 35 obj.interface(); 36}
このコードは VC++ では問題なく通り、実行すると 1
とメンバ変数 member_
の値が出力されます。
しかし、gcc でビルドすると以下のコンパイルエラーが発生します。
output
1error: ‘member_’ was not declared in this scope 2 std::cout << member_ << std::endl; 3 ^
this ポインタから参照するように修正すると、gcc でもコンパイルが通ります。
diff
1- std::cout << member_ << std::endl; 2+ std::cout << this->member_ << std::endl;
自分の理解では、public で継承しているので、親クラスでアクセス修飾子が protected である member_ には、子クラスからもアクセスできるはずとの認識ですが、なぜ変数が定義されていないとエラーになってしまうのでしょうか。
聞きたいこと
- gcc でコンパイルエラーとなる理由
- C++ の仕様としては「コンパイルが通る」または「コンパイルエラーとなる」のどちらが正しいのか
すみませんが、よろしくおねがいします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/14 05:03