![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
先ほど以下のようなプログラムを書いたのですがコンパイルを通すことができません。
//適当なポインタを保持するだけのクラス
template <class _type>
class hoge
{
private:
//適当に変数を保持
_type val;
public:
//コンストラクタで適当に値をセット
hoge() : val( 0 ){}
//このクラスから唯一ポインタを引っ張ってくる方法
friend _type getVal( const hoge& foo )
{
// そのまま返す
return foo.val;
}
};
void func( const hoge<int>& foo )
{
//値を引き出す
getVal( foo );
}
void main()
{
//実体化
hoge<int> foo;
//値を引き出す
getVal( foo );
//関数の先で値を引き出す
func( foo );
}
上記のようなプログラムを書いたのですが、main関数内でgetValを呼び出す場合はとくに問題ないのですがfunc関数を呼び出してfunc関数内でgetValを呼び出すと
error C3861: 'getVal': 識別子が見つかりませんでした
error C2365: 'getVal' : 再定義; 以前の定義は '以前は不明な識別子' でした。
コンパイルされたクラスの テンプレート のインスタンス化 'hoge<_type>' の参照を確認してください
というエラーが出てしまいます。
func関数の引数を( const hoge<int>& foo )からvoid func( hoge<int> foo )のように参照渡しから実体渡しに変更するとコンパイルが通り、実行もできるのですが、なぜこれでコンパイルが通るのか理由がいまいちよくわかりません。
またやはり、コンストラクタ、デストラクタの問題などから実体渡しより、参照渡しを使いたいのですがどのようにプログラムを書けば今回の問題を解決できますでしょうか。
よろしくおねがいします。
/*
VisualStudio2005 AcademicEdition
MicroSoft WindowsXP Professional 32bit
*/
No.3ベストアンサー
- 回答日時:
こんにちは。
度々すみません。friendに別のテンプレートを付けておき、外側でhogeのスコープを外して別のテンプレートでfriendの中身を書いても解決出来ます。此方の方が良いかも。
以下で出来ます。
//適当なポインタを保持するだけのクラス
template <class _type>
class hoge
{
private:
//適当に変数を保持
_type val;
public:
//コンストラクタで適当に値をセット
hoge() : val( 0 ){}
//このクラスから唯一ポインタを引っ張ってくる方法(別のテンプレートを与える)
template<class _type2>
friend _type2 getVal( const hoge<_type2>& foo );
};
//hogeのスコープを外して与えたテンプレートで中身を書く
template<class _type2>
_type2 getVal(const hoge<_type2>& foo)
{
// そのまま返す
return foo.val;
}
No.2
- 回答日時:
こんにちは。
VC++のfriendをテンプレートで使用すると、色々と問題があるから厄介です。
func関数を以下の様にテンプレートにするか、
template<class _type>
void func( const hoge<_type>& foo )
{
//値を引き出す
getVal( foo );
}
又はfriendを止めてstaticにして、hoge<int>::getVal( foo )にすれば罷り通るみたいです。
//適当なポインタを保持するだけのクラス
template <class _type>
class hoge
{
private:
//適当に変数を保持
_type val;
public:
//コンストラクタで適当に値をセット
hoge() : val( 0 ){}
//このクラスから唯一ポインタを引っ張ってくる方法
static _type getVal( const hoge<_type>& foo )
{
// そのまま返す
return foo.val;
}
};
void func( const hoge<int>& foo )
{
//値を引き出す
hoge<int>::getVal( foo );
}
void main()
{
//実体化
hoge<int> foo;
//値を引き出す
hoge<int>::getVal( foo );
//関数の先で値を引き出す
func( foo );
}
No.1
- 回答日時:
コンパイラのバグみたいです。
VC 2008ではコンパイルが通ります。
理由は分からないですが、
funcの定義の前に以下の1行を書いておくとVC 2005でもコンパイルが通りました。
void dummy(hoge<int>){}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# Makefileのechoの展開について 2 2022/07/26 07:35
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
独習C言語のコンパイル
-
次のhtml・cssでspan内の文字を...
-
関数の動きと記述方法の意味を...
-
.htaccessによる301リダイレクト
-
検索結果へのリンク
-
関数内関数から関数外関数を呼...
-
if文
-
DLL内でnewしたインスタンスを...
-
サブネットマスクを用いたIP制...
-
PHPで、相対的な変数名の場合の...
-
htmlで変数の表示
-
IIS5.1で「規定のドキュメント...
-
fwriteで改行出来ない
-
変数格納 クォーテーション「...
-
バッチファイルでpingの結果を...
-
Dosブロンプトでtabを出力したい
-
「取得先」という表現について
-
DTOとEntityの差は何ですか。
-
wordの差し込み印刷で文字...
-
ブラウザバックしてもチェック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
可変変数にアロー演算子を使いたい
-
VB.NETからVBAマクロ(引数)を呼...
-
PHP、ヒアドキュメント内でのIF...
-
VB.NETSystem.Xml 要素数を得る...
-
どういうプログラムを関数化を...
-
vb作成したらでbeep音が鳴りま...
-
次のhtml・cssでspan内の文字を...
-
classの再定義エラーについて
-
既存関数の上書き
-
protectedなのにアクセスできな...
-
配列の操作時にLNK2001外部シン...
-
UNIX CP "で上書きしません"
-
PHPでの画像の形式の変換
-
PHPプログラム上で「URLを直接...
-
Let's Encryptで自動更新がされ...
-
ExcelVBAで部分一致(*)をしたい
-
VB6のコンボボックスのテキスト...
-
ASPのResponse.WriteをPHPでは...
おすすめ情報