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;,并将 '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> *);
        };

    };
};
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 回答