🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

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

Q&A

解決済

2回答

405閲覧

テンプレート使用構造体を定数として利用

kurara674

総合スコア29

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

C++

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

0グッド

0クリップ

投稿2019/11/26 00:48

編集2019/11/26 00:51

前提・実現したいこと

C++でテンプレートの勉強をしています。
引数付きコンストラクタを追加した場合は、
クラス定数として利用できないのでしょうか?

下記の場合だと、型指定子が必要 だと出ます。

ご教示の程宜しくお願い致します。

該当のソースコード

C++

1template <typename T> 2 3struct VECTOR { 4 T x,y,z; 5 6 VECTOR() = default; 7 VECTOR(T x, T y,T z) { this->x = x; this->y = y; this->y = z; } 8 9//その他 様々なoperator 10}; 11 12class Test{ 13private: 14//constexpr? 15 static const VECTOR<int> pos(100,100,100); 16};

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

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

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

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

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

guest

回答2

0

ベストアンサー

静的メンバ変数の初期化定義を行えばよいです。

c++

1class Test{ 2private: 3 static const VECTOR<int> pos; 4}; 5 6const VECTOR<int> Test::pos(100,100,100);

もしくは、C++17以降inline指定を行うことで

c++

1class Test{ 2private: 3 static inline const VECTOR<int> pos{100,100,100}; 4};

も可能です。


他に、constexpr指定をコンストラクタに対して行う事も可能です。

c++

1template <typename T> 2struct VECTOR { 3 T x,y,z; 4 5 VECTOR() = default; 6 constexpr VECTOR(T x, T y,T z) : x(x),y(y),z(z) { } 7}; 8 9class Test{ 10private: 11 static constexpr VECTOR<int> pos = {100,100,100}; 12};

投稿2019/11/26 01:09

編集2019/11/26 01:27
asm

総合スコア15149

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

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

kurara674

2019/11/26 01:15

回答有難うございます! 宣言と初期化は纏めて書くことはできないということでよろしいでしょうか・・?
asm

2019/11/26 01:36

初期化というとなんか違うので定義に変更しました。 また、C++17以降ならばinline指定にてクラス内での宣言と同時に定義が可能 C++14以降はconstexprによって定数として利用できるのでその旨を追記しました。
asm

2019/11/26 01:40

クラスの宣言は普通ヘッダに書き、複数のソースに組み込まれます。 そのため、そこで変数が定義されていると複数の変数が定義されてしまうのでクラスの静的メンバ変数の宣言と定義は分ける必要があります。
kurara674

2019/11/26 03:00

ごめんなさい!!!! ベストアンサー間違えました・・・・・
guest

0

3つ目のconstexpr指定で解決することが出来ました!
様々な解決法を教えていただき有難う御座います・・・!

投稿2019/11/26 02:47

kurara674

総合スコア29

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

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

kurara674

2019/11/26 15:02

携帯からだとベストアンサー編集できました… 失礼いたしました…!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問