实例化错误后如何避免专业化

How to avoid specialization after instantiation error?

本文关键字:何避免 专业化 错误 实例化      更新时间:2023-10-16

这是一个简化的问题。

template <class T>
std::string name(const T&);  // This is the template 
                             // I want to explicitly specialize.
class Outer
{
    class Inner
    {
    };
    class Container : public ::Container<Inner> // This causes also an implicit
                                                // specialization of f::name
    {
    };
};

我如何专门化

template <class T>
std::string name(const T&);

对于Outer::Inner

我不能在我考虑的三个地方宣布明确的专业化:

template <class T>
std::string name(const T&); 
// 1. Here I cannot forward declare a nested class
class Outer
{
    class Inner
    {
    };
    // 2. Here I get error: explicit specialization
    //    in non-namespace scope 'class Outer'
    class Container : public ::Container<Inner>
    {
    };
};
// 3. Here I get error: specialization of '...' after instantiation

我该如何解决这个问题?

看看这篇文章。您最好只为您想要"专门化"的特定类型编写一个name函数:

std::string name(const Outer::Inner&);