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

时间:2012-07-17 05:24:43

标签: c++ templates nested-class

以下是简化问题。

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&);

for 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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

看看this article。您可能最好只为您想要“专门化”的特定类型编写name函数:

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