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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

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

Q&A

解決済

2回答

2723閲覧

テンプレートクラスの継承がうまくできない。

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

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

0グッド

0クリップ

投稿2018/01/09 14:05

編集2018/01/09 14:23

2つのテンプレートクラスを作成して時に一方のクラスからもう一方のクラスのメンバ変数にアクセスできたら便利だなぁと思いまして。
最初はfriendを使うことで実現できたのですが、継承でも可能なのでは??と思い試してみたのですが・・・うまくいきません。

省略していますが、以下がソースです。

C++

1 2template<class Param> 3class functions_set { 4 protected: 5 Param _max; 6 Param _num; 7 Param *_set; 8}; 9 10template<class Param> 11class functions_double_set : public functions_set<Param> { 12 private: 13 typedef class functions_set<Param> func; 14 public: 15 void assign(func *, const func *); 16 int equal(func *, func *); 17 func* Union(func *, const func *, const func *); 18 func* intersection(class functions_set<Param> *, const class functions_set<Param> *, const class functions_set<Param> *); 19 func* difference(class functions_set<Param> *, const class functions_set<Param> *, const class functions_set<Param> *); 20};

1,
色々とごちゃごちゃなのですが、名前が長いのでtypedefを使おうとしたのですが、派生クラスのprivateのなかのtypedefはエラーです。
逆に継承しない実装だと問題ありません。
他に長い名前を置き換える手段はありませんか??
usingもなんかエラーが出てきます。

typedefを使わないで長い名前のままで記述すると問題なく動作します。

2,
続いて、以下のようにオブジェクトを作成するとエラーです。
functions_double_set<int> funcs;

これも継承すると出てくるエラーです。
error: use of deleted function ‘functions_double_set<int>::functions_double_set()’
なんですかこれは??
どうすればできるのでしょうか??

3,
テンプレートにすると
基底クラスのメンバにアクセスできない。
protectedを付けているので派生クラスからメンバ変数へアクセスは可能であるはずです。

これは、以下のサイトで解決しました。
テンプレートクラスの継承
なぜテンプレートにした途端に、thisを付けなくてはいけないんでしょうか?

テンプレートクラス&継承が少々難しいです。
おまけに派生クラスのメンバ関数のパラメータには、基底クラスを代入しなくてはいけないので、なお頭が痛いです。
要はfriend以外で基底クラスのメンバ変数を参照できるようにしたいのです。
継承でもできるはずなのでわかる方教えてください。

環境はlinux 64bit gcc です。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

もしかするとコピペミスかも知れませんが、functions_double_set クラス・テンプレートのプライマリーを2つ定義してますよ?
最初のものは、functions_setの間違いでは?

投稿2018/01/09 14:22

Chironian

総合スコア23272

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

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

strike1217

2018/01/09 14:23

あ、本当だ!すいません。修正します。
strike1217

2018/01/09 14:28

あららら?? 変ですね〜 私のコンパイラはエラー吐き出してます。 ちょっと待ってください。再度確認します。
strike1217

2018/01/09 14:37

const int N = 512; functions_set<int> s1(N), s2(N), temp(N); functions_double_set<int> funcs; 基底クラスと派生クラスを同時にオブジェクト作成するとおかしくなる・・・という話はあるんでしょうか?
strike1217

2018/01/09 15:00

あ、もしかして基底クラスの方にコンストラクタが存在するとうまくいかないんでしょうか??
strike1217

2018/01/09 15:26

ああ!すいません。無事に解決しました。 私のミスです。 ありがとうございました。
Chironian

2018/01/09 15:32

おっとと、気がついたら無事に解決されたようで、良かったです。
guest

0

何がしたいのかよくわからないけど、まずもってクラス名が再定義されてるわな・・・

https://wandbox.org/permlink/qkxRyJvw4O5N9VXA

投稿2018/01/09 14:25

yumetodo

総合スコア5852

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

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

strike1217

2018/01/09 14:47

クラス名が再定義される・・・とはどういうことです??
yumetodo

2018/01/09 16:05

Chironianさんの指摘の通り、「最初のものは、functions_setの間違いでは?」という話
strike1217

2018/01/10 03:42

ああ!なるほど!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問