編集:エラーを再現するために必要なものだけを含むようにコードが切り詰められました。エラーはで発生し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> *);
};
};
};