1

次のような状況があります。

template <class A, typename B, typename C, class D>
class Base
{
    public:
       // ctor and virtual dtor
       // functions
       class Inner
       {
           //...
       };

    protected:
       // members
};

template <class E>
class Sub : public Base<std::string, float, double, E>
{
    public:
       // ctor and virtual dtor

       // functions using Inner class inherit from Base
};

msvc は正常にコンパイルされますが (ctp nov 2012 コンパイラを使用した Visual Studio 2012)、gcc (トランクからの 4.9.0 ビルド) は Base から使用されるすべてのメンバーと Base からの内部クラスについて不平を言います。

テンプレートに関しては、msvc は非常に緩和されていることに気付きましたが、このコードを実行し、gcc を使用して Linux でコンパイルする必要もあります。では、msvc は受け付けるが gcc は受け付けない偽のコードはどこにあるのでしょうか?

4

1 に答える 1

2

中心的な問題は、インスタンス化時ではなく、テンプレート パラメーターに依存しない名前が宣言時に検索されることです。Base<std::string, float, double, E>::Innerの代わりにeg を使用するInnerか、クラスに using 宣言を入れます: using Base<std::string, float, double, E>::Inner。これにより、名前が依存するようになり、インスタンス化時に検索されます。

詳細については、「従属名ルックアップ」を検索してください。

于 2013-09-12T08:02:44.753 に答える