【问题标题】:Full specialization of method template from class template类模板中方法模板的完全专业化
【发布时间】:2010-12-04 09:36:33
【问题描述】:

我知道这个主题现在应该已经过时了,但我很难处理这个具体案例。

直截了当,这就是我想做的:

enum MyEnum
{
    E_1,
    E_2
};

template <MyEnum T>
class MyClass
{
    // method to be fully specialized
    template <typename U>
    void myMethod(U value);
};

// full specialization of method template from class template
// (or is this in fact partial, since I'm leaving T alone?)
template <MyEnum T>
template <>
void MyClass<T>::myMethod<int>(int value)
{
    std::cout << value << '\n';
}

这可能吗?

【问题讨论】:

    标签: c++ templates gcc template-specialization


    【解决方案1】:

    C++03 [$14.7.3/18] 说

    在为类模板的成员或出现在命名空间范围内的成员模板的显式特化声明中,成员模板和它的一些封闭类模板可能保持非特化,除非声明不应显式特化如果它的封闭类模板也没有明确专门化,则为类成员模板

    所以你也需要专门化封闭类。

    这样的事情会起作用。

    template <>
    template <>
    void MyClass<E_1>::myMethod<int>(int value)
    {
        std::cout << value << '\n';
    }
    

    【讨论】:

    • 你的回答让我大开眼界。我很惭愧地注意到我总是把“你必须专门化封闭类”的事情弄错了:我以为我必须实际上重新声明整个类,但这只是意味着我必须复制专门化的方法......对?这有点无聊,但比我想象的要好得多!
    【解决方案2】:

    既然你离开了 T,同时只特化了函数模板,那么你试图做的将被称为部分特化,因为 T 仍然是模板化的,你可以在你的函数中使用它。但不幸的是,不允许函数的部分模板特化(无论是成员函数还是非成员函数)。所以你的代码会给出编译错误。

    您要么完全专精于类模板,要么完全不专长。

    【讨论】:

    • 是的,现在说得通了。当我听到人们说我“必须专攻整个班级”时,我从来没有想过重写整个班级的想法。直到今天我才意识到他们提到了模板 模板 ... 真是太棒了~
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2018-08-25
    相关资源
    最近更新 更多