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

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

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

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

Q&A

解決済

1回答

815閲覧

部分特殊化したときのprivate変数へのアクセス方法

jbe00214

総合スコア63

C++

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

0グッド

1クリップ

投稿2020/09/05 07:32

前提・実現したいこと

次のようなコードで関数 fからプライベートメンバにアクセスできません。
どのようにすると良いのか,お知恵をお願いします。

該当のソースコード

C++

1template<typename T> 2class A{ 3 T a; 4public: 5 A(T a):a{a}{} 6 void f(A<T*> p){a=*p.a;}///ここでエラー 7};

試したこと

クラスA同士のことなので,そもそもプライベートメンバにアクセスできない理由がわかりません。A<T>とA<T*>は別のクラスということが原因かと思い,以下の部分特殊化をしてみたのですが,使い方がよくわかりません。おそらくfriendを使うと思うのですが,わかりませんでした。

C++

1template<typename T> 2class A<T*>{ 3 T* a; 4 A(T* a):a{a}{} 5}; 6

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

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

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

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

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

jbe00214

2020/09/05 08:49

早速,ご検討ありがとうございます。やりたいことは,このコードで良いですが,関数f内ではポインタ経由であることが必要です。
mjk

2020/09/05 09:21 編集

ポインタ経由であることが必要の理由が分かりませんが、C++なら参照渡しで良いのでは? (必要な理由が分からない素人の思う素朴な疑問なので他意はありませんあしからず) https://paiza.io/projects/riMGJbioxvqn3wgxp5D25A?language=cpp void f(const A<T> &p) { a = p.a; } aa.f(bb);
jbe00214

2020/09/05 10:11 編集

ありがとうございます。正確でなかったので改めて説明しますと,ポインタ経由というより,A<T*>で渡されることが,マストです。次のような FooクラスとFooのメンバを参照するFooRefクラスがあり,Foo内部で両者のメンバの演算をf関数で行うということを実現したいことです。a.f(r)の部分が質問とした演算の部分です。 ``` template<typename T> class FooRef{ A<T*> a; }; template<typename T> class Foo{ A<T> a; void f(FooRef<T>& r){ a.f(r); } }; ```
mjk

2020/09/05 10:21

部分特殊化ということが何かも知らずコメントして失礼しました。 素人の私が回答できる範疇を超えているので良い回答がつくことを期待してクリップさせて頂きます。 https://mimosa-pudica.net/cpp-specialization.html
guest

回答1

0

ベストアンサー

特殊化しようがしまいが A<T>A<T*> は別の型です。

ご想像の通り friend 関数を使えばよく、やりたいのはおそらくこういうことなのではないでしょうか。

#include <type_traits> template<typename T> class A{ friend class A<typename std::remove_pointer<T>::type>; T a; public: A(T a):a{a}{} void f(A<T*> p){a=*p.a;} };

特殊化するのであれば friend 宣言は A<T*> の方にすればよいですね。

#include <type_traits> template<typename T> class A{ T a; public: A(T a):a{a}{} void f(A<T*> p){a=*p.a;} }; template<typename T> class A<T*> { friend class A<T>; T* a; public: A(T* a):a{a}{} };

投稿2020/09/05 13:42

編集2020/09/05 14:35
SaitoAtsushi

総合スコア5466

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

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

jbe00214

2020/09/05 15:06

いやあ,おっしゃる通り,うまく行きました。class A のプライマリの方にfriend を入れてできなかったので,勘違いしていました。でも,やりたかった本当の方は前者ですから,解決しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問