ページ 11

whose type uses the anonymous namespace

Posted: 2013年5月27日(月) 23:28
by dom
下記のようなコードをgcc4.7でコンパイルすると警告が出ます。どうやら、
内部リンケージを持つものを継承しているのが問題なようですが、
私には何が問題なのかいまいち理解できません。
この警告の必要性とその解決法について教えていただけないでしょうか?

コード:

// hoge.h
class Hoge
{
public:
    // ...
private:
    // ...
    class Impl;
};


// hoge.cpp
class Hoge::Impl
{
public:
    struct InnerA;
    struct InnerB;
    struct InnerC;
   // ...
};

namespace {
class ImplBase
{
    // ...
};
} // end namespace

struct Hoge::Impl::InnerA : public ImplBase// <--エラー
{
public:
    static void func(Hoge& hoge)
    {
        // hogeのprivateにアクセス
    }
};


Re: whose type uses the anonymous namespace

Posted: 2013年5月28日(火) 23:32
by beatle
http://idlysphere.blog66.fc2.com/blog-entry-187.html
にも似たような症状がありました。
この警告はバグとして4.3系で直されたと書いてありましたが…
再発か、または微妙に違う箇所での警告なので元々Bug 29365には含まれていなかったか。

一つ考えられるのは、ImplBaseは翻訳単位ローカルな名前に対して、Hoge::Impl::InnerAは翻訳単位ローカルではないので、
Hoge::Impl::InnerAを他の場所で使うときに親クラスが見えないのは論理的におかしい、という判断があるのかもしれません。
(C++の規格の該当箇所は読んでいないので、本当のところは分かりません)