[過去ログ] C++相談室 part130 [無断転載禁止]©2ch.net (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
534
(3): (ワッチョイ 9f3d-SU2+) 2017/06/22(木)18:59 ID:RmXtROOS0(1/4) AAS
templateのstaticメンバの初期化(実体化)についてわかる人、
教えてもらえないでしょうか。

次のようなクラス構成があります
template<typename T> class A {
public:
A() : foo(NULL) {}
...

void * foo;
};

template<typename T> class B {
省16
535
(1): (オッペケ Sr0b-jRIn) 2017/06/22(木)19:26 ID:Pj60YbTlr(1/3) AAS
>template<> A<C> B<C>::bar;

本当に実体化をしようとしているのか、明示的な実体化が必要なのか疑問だ
template<…> X →テンプレート定義
template<…> X<Y> →テンプレート定義(部分特殊化)
template<> X<…> →フルの特殊化
template X<…> →明示的実体化
X<…> →使うことで暗黙の実体化
536: (ワッチョイ 9f3d-SU2+) 2017/06/22(木)19:46 ID:RmXtROOS0(2/4) AAS
>>535
レスありがとうございます。

実際のコードでは、AとBはそれぞれのヘッダファイルにすべて記述され、
Cのみcppでコード生成しています。1)及び2)はCのソース内に記述しています。
このため、スペシャライズは不要な筈ですが、B内で定義しているstatic変数は
Bのクラス内で使用しているため、実体化が必要です。
bar自体はコンストラクタがあるので、普通のstatic変数のように書けば
良いのではないかと思うのですが…。
何か勘違いしてるんですかね?
537: (ワッチョイ 9f3d-SU2+) 2017/06/22(木)20:07 ID:RmXtROOS0(3/4) AAS
>>534です、連投すいません。
どうやら解決したようです、デバッグしてみないと本当に解決しているか
どうかはわかりませんが(^^;

stackoverflowにヒントがありました。

外部リンク:stackoverflow.com
// needs a copy constructor!
template<> Type Class<Arguments>::member = Type();

コピーコンストラクタで無理やり実体を作るという…。
vc、llvm、gccでそれぞれ書き方が違うとは、やな世の中になったもんだw
538
(1): (オッペケ Sr0b-jRIn) 2017/06/22(木)20:44 ID:Pj60YbTlr(2/3) AAS
特殊化の説明を読んでいるのがよくわからんが
G++で通るコードとやらを貼っとくか

外部リンク:ideone.com
539
(1): (ワッチョイ 374b-ckEx) 2017/06/22(木)20:51 ID:6MphhRRE0(1) AAS
>>534
> 3) GCC 4.9では1)でコンパイルは通るが実体化されない。
実体化されないの意味がよくわからんが
B::barの定義がないからだろ
外部リンク:wandbox.org
540: (オッペケ Sr0b-jRIn) 2017/06/22(木)21:50 ID:Pj60YbTlr(3/3) AAS
>>534
>1) 以下のように書くとVC++では問題ない
>template<> A<C> B<C>::bar;

これはVisual C++が規格の14.7.3段落13を正しく実装していないためで
2)の書き方が正しい
541: (ワッチョイ 9f3d-SU2+) 2017/06/22(木)21:52 ID:RmXtROOS0(4/4) AAS
>>538さん, >>539さん
ありがとうございます。

なるほど、template<typename T>のままで初期化すればよかったんですね。
あ、でも、vc++2012でエラーが出ますね。
non-aggregates cannot be initialized with initializer list

vc++2015はプロジェクトを作ってないのでわかりません。
xcodeは、明日確かめてみます。
あ〜、templateは嫌いだorz
542
(1): (ワッチョイ 7f91-yPlv) 2017/06/24(土)13:41 ID:u+Yuz9bZ0(1) AAS
配列に格納された行列同士の乗算がしたいんだけどさ
EigenのMapってこれ、コンパイル時に行列の行数・列数が決まってない時はどうやって利用するもんなの?
外部リンク[html]:eigen.tuxfamily.org
Vector型に変更したりしてたら遅くなっちゃうだろうし・・・・どうやるんだろ・・・・
543: (スッップ Sdbf-iOY8) 2017/06/24(土)16:50 ID:1xYcuW8pd(1) AAS
>>542
ろくに見ずに答えるけど、テンプレートパラメータを明示的に与えられないの?
544: (ブーイモ MMbf-Cfyt) 2017/06/24(土)17:52 ID:UzNhAedeM(1) AAS
サンプルみた感じ、Dynamicっていうキーワードがあるみたいだけど
545
(3): (ワッチョイ 9f32-LvKX) 2017/06/25(日)14:15 ID:ogKde9930(1/2) AAS
union aaa{
uint8_t byte[ 5 ];
struct bit_t {
uint32_t b0 : 5;
uint32_t b1 : 5;
uint32_t b2 : 5;
uint32_t b3 : 5;
uint32_t b4 : 5;
uint32_t b5 : 5;
uint32_t b6 : 5;
省19
546
(1): (ワッチョイ f796-Cfyt) 2017/06/25(日)15:01 ID:WDBvKZ4J0(1) AAS
byte境界でないと配置できない環境なんじゃないの?
547: (ワッチョイ 9f32-MYey) 2017/06/25(日)15:16 ID:vsjTFzMZ0(1) AAS
uint32_tに5ビットずつ詰めてるからだろ
548: (ワッチョイ 9f9f-Yx6S) 2017/06/25(日)15:37 ID:ogZvFgu/0(1/2) AAS
普通は単に unsigned b0:5: と書くべき
ビットフィールドに32tとか余計なモノ乗っけると解釈がおかしくなる
549: (ワッチョイ 9f9f-Yx6S) 2017/06/25(日)15:41 ID:ogZvFgu/0(2/2) AAS
あとは副作用でpackアラインが1になってないから無理矢理境界作ってコンパイラが揃えようとしているとか
550: (ワッチョイ bfe4-Nep8) 2017/06/25(日)15:51 ID:k9VtfbZw0(1) AAS
共用体の統一初期化記法のことはよくわからないけどちゃんとコンストラクタを書けば解決するのでは
外部リンク:wandbox.org
551
(3): (ワッチョイ ffaa-4OJu) 2017/06/25(日)16:07 ID:Y80WzbX30(1) AAS
C++を、10年以上勉強してから、共用体を使え

そもそも、初心者が使い道を知らないだろ
552: (ワッチョイ 9fc3-NIhq) 2017/06/25(日)17:09 ID:/94nlHOp0(1) AAS
>>545
なぜ一致すると思うのかをまず説明すべきではないかね?
553: (ワッチョイ 1f91-ZLad) 2017/06/25(日)17:14 ID:CENP8UyG0(1) AAS
99: 1100011
35: _100011
何度かやってみると、合う時もあるな
1-
あと 449 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.348s*