1

我正在尝试创建一个 CRTP 类,其中包含一个未定义的类 --- 由派生类定义,如下所示:

#include <memory> // unique_ptr

template<typename T>
class crtp
{
    public:
        class inside;

        crtp();

        std::unique_ptr<inside> m;
};

这适用于非模板数据类型。

但是,如果我尝试将模板类传递给它,例如:

template<>
template<typename T>
class crtp<test::TestClass<T>>::inside
{
    public:
        inside()
        {
            std::cout << "Instantiated." << std::endl;
        }
};

它给出了以下错误:

error: invalid class name in declaration of ‘class crtp<test::TestClass<T> >::inside’

我正在使用 gcc 4.6.1。

我在这里想念什么?我觉得这与模板的实例化方式有关,但我不确定我应该寻找什么。

编辑:澄清一下,像crtp的构造函数之类的东西已经在别处定义了(我应该发布它吗?它只是初始化unique_ptr)。我唯一需要专门化的是内部类的定义。

4

1 回答 1

2

您不能部分特化外部模板来定义嵌套类;只允许完全专业化(例如template <> class crtp<int>::inside)。相反,您可以提供整个模板的部分特化:

template <typename T>
class crtp<test::TestClass<T>>
{
public:
    class inside { /* ... */ };
    // ...
};
于 2012-07-24T23:11:22.167 回答