3

編集:エラーを再現するために必要なものだけを含むようにコードが切り詰められました。エラーはで発生しconst V * Resolve(const Resource<T> *);、ですerror C2923: 'Resource' : 'T' is not a valid template type argument for parameter 'T'

この投稿の最後に表示されているコードをコンパイルするためにMSVC++2010 Expressを使用していますが、次のエラーが発生します。

1>test.cpp(119): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>          test.cpp(121) : see reference to class template instantiation 'Resource<T>::Api<U>::ContainerDerived<V>' being compiled
1>          test.cpp(136) : see reference to class template instantiation 'Resource<T>::Api<U>' being compiled
1>          test.cpp(143) : see reference to class template instantiation 'Resource<T>' being compiled
1>test.cpp(119): error C2143: syntax error : missing ',' before '&'
1>test.cpp(120): error C2923: 'Resource' : 'T' is not a valid template type argument for parameter 'T'

(コードの119行目はこれですstd::auto_ptr<Dependent<V> > Construct(const T &);:)

template <typename V> class ContainerDerived;前方宣言により、の定義がContainerDerived祖先クラスのTパラメーターの「可視性」を失うように思われますResource<T>

これが私が試したことです:

  • Dependent<V>andの定義順序を切り替えContainerDerived<V>(後者が最初に表示されるように)、前方宣言をに変更しtemplate <typename V> class Dependent;ます。これによりContainerDerivedが修正されますが、Dependentでも同じ問題が発生します。
  • いずれかの定義の前に追加typedef T FooBar;し、Dependent/ContainerDerivedのいずれか/両方で「T」のすべてのインスタンスを「FooBar」に切り替えます。これはコンパイルされますが、「T」と「V」が同じタイプである場合の意図された特殊化は発生しません。

基本的に、何かの前方宣言を追加すると、その定義からTパラメーターがわかりにくくなるようです。なぜこれが発生するのか誰かが知っていますか?

コードは次のとおりです。

#include <memory>

template <typename TypeContainer, typename TypeContained>
class Proxy
{
public:
    class Container {};

    Proxy(TypeContainer * = NULL);
    Proxy(Proxy &);
    ~Proxy();
};

struct Dummy {};

template <typename T>
class Resource : public T, public Proxy<Resource<T>, Dummy>::Container
{
public:

    template <typename U>
    class Api
    {
    public:

        template <typename V> class ContainerDerived;

        template <typename V>
        class Dependent : public Proxy<ContainerDerived<V>, Dependent<V> > {};

        template <typename V>
        class ContainerDerived
        {
        public:
            const V * Resolve(const Resource<T> *);
        };

    };
};
4

1 に答える 1

1

これらの関係にはかなりの複雑さがあります。typename主な問題のうち、先行する依存名を使用する必要があります。

template <typename V>
class ContainerDerived : public ContainerBase<ContainerDerived<V>, Dependent<V> >
{
public:
        typedef typename Api::Dependant<V> DV;
        typedef typename Resource::T TX;
    std::auto_ptr<DV> Construct(const TX &);
        typedef Resource<typename Resource::T> TR;
    const V * Resolve(const TR *);
};
于 2012-06-19T19:33:26.327 に答える