スレッド: [cppll:8657] 無名名前空間の関数をfriendにしたい

スレッド

[cppll:8657] 無名名前空間の関数をfriendにしたい

[ | ▲ / | ]
Subject:
[cppll:8657] 無名名前空間の関数をfriendにしたい
From:
Morizzo <morizzo@...>
Date:
Thu, 08 May 2003 12:01:47 +0900
X-Mailer:
EdMax Ver2.85.3F
Message-Id:
<20030508030309.20584.qmail‐at‐mizar.freemail.ne.jp>
皆さん、こんにちは。Morizzoと申します。
初歩的な質問だと思いますが、教えていただければ幸いです。

いま、無名名前空間(「グローバル名前空間」が正しい?)にある関数を
ある名前空間に入っているクラスのfriend関数に指定しようとしていますが、
コンパイラがうまく認識してくれません。

typedef int RESULT;
namespace Hoge { class Foo; }

// friendにしたい無名名前空間上の関数prototype
int CreateFoo(Hoge::Foo*& fooptr);
RESULT CreateFoo2(Hoge::Foo*& fooptr);

namespace Hoge
{
 class Foo
 {
   protected:
     Foo();
     friend int CreateFoo(Foo*& fooptr);       // <-- (1-A)
     friend RESULT CreateFoo2(Foo*& fooptr);   // <-- (1-B)
 };
};

int CreateFoo(Hoge::Foo*& fooptr)
{
   fooptr = new Hoge::Foo;                    // <-- (2)
   return 0;
}

RESULT CreateFoo2(Hoge::Foo*& fooptr)
{
   fooptr = new Hoge::Foo;                    // <-- (3)
   return 0;
}

この書き方だと、コンパイラは無名名前空間上の::CreateFoo()ではなく、
Hoge::CreateFoo()という関数をHoge::Fooのfriend関数と見なすようで、
(2)および(3)の行で「プロテクトメンバにアクセスできない」旨の
エラーになりました。


そこで、上の(1-A)と(1-B)を
     friend int ::CreateFoo(Foo*& fooptr);     // <-- (1-A')
                ~~
     friend RESULT ::CreateFoo2(Foo*& fooptr); // <-- (1-B')
                   ~~
のように書き換えると、
VC7では・・・
   (1-A')のところ:コンパイルOK!! (2)でもエラーなし
   (1-B')のところ:「C2062 :型 'int' は不要です」なるエラー発生。
となりました。
gcc2.95では・・・
   (1-A')のところ:「parse error before `('」なるエラー発生
   (1-B')のところ:「`int' is not an aggregate type」なるエラー発生
でした。

CreateFoo()/CreateFoo2()関数をHoge::Fooクラスのfriend関数とするには、
どう書くのが正解なのでしょうか?
よろしくお願いします。

[cppll:8658] Re: 無名名前空間の関数$rfriendにしたい

[ | / | ]
Subject:
[cppll:8658] Re: 無名名前空間の関数$rfriendにしたい
From:
Takao Ono <takao@...>
Date:
Thu, 8 May 2003 12:12:28 +0900
X-Mailer:
mnews [version 1.22PL5] 2001-02/07(Wed)
Message-Id:
<030508121228.M0101081‐at‐flame.hirata.nuee.nagoya-u.ac.jp>
In-Reply-To:
8657
小野@名古屋大学 です.

<20030508030309.20584.qmail@mizar.freemail.ne.jp>の記事において
morizzo@...さんは書きました。
morizzo> CreateFoo()/CreateFoo2()関数をHoge::Fooクラスのfriend関数とするには、
morizzo> どう書くのが正解なのでしょうか?
morizzo> よろしくお願いします。
手元の実験によれば
friend int (::CreateFoo)(Foo*& fooptr);
及び
friend RESULT (::CreateFoo2)(Foo*& fooptr);
でいけました.
# g++ 3.2.2 及び icc 7.1 build 20030424Z で確認済み.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男

[cppll:8670] Re: 無名名前空間の関数をfriendにしたい

[ | / ▼ | ]
Subject:
[cppll:8670] Re: 無名名前空間の関数をfriendにしたい
From:
Morizzo <morizzo@...>
Date:
Thu, 08 May 2003 22:26:58 +0900
X-Mailer:
EdMax Ver2.85.3F
Message-Id:
<20030508132826.2754.qmail‐at‐mizar.freemail.ne.jp>
In-Reply-To:
8658
References:
8658
Morizzoです。
突然のHDDクラッシュで返事が遅くなってしまいました。いま仮復旧したとこです。

小野@名古屋大学さん wrote:
> 手元の実験によれば
> friend int (::CreateFoo)(Foo*& fooptr);
> 及び
> friend RESULT (::CreateFoo2)(Foo*& fooptr);
> でいけました.

ここにカッコをつけるとは・・・盲点でした。
普通の関数宣言や呼び出しの時はつけなくてもよかったものですから。

VC7でも(もちろんgcc2.95でも)正常にコンパイルでき、
期待通りの動作ができました。
勉強になりました。ありがとうございました。

Navigation

検索

[検索ヘルプ]

Maintener: Tietew <www.tietew.jp>
Powered by Ruby on Rails, Mongrel, PostgreSQL, and Hyper Estraier.
click here