编辑:代码已被精简为仅包含重现错误所必需的内容。错误发生在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;
,并将 'T' 的所有实例切换到 Dependent/ContainerDerived 的任一/两者中的 '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> *);
};
};
};