Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从类模板到方法模板的完全专门化_C++_Templates_Gcc_Template Specialization - Fatal编程技术网

C++ 从类模板到方法模板的完全专门化

C++ 从类模板到方法模板的完全专门化,c++,templates,gcc,template-specialization,C++,Templates,Gcc,Template Specialization,我知道这个话题现在应该已经差不多过时了,但我对这个具体的案例感到很为难 直截了当地说,这就是我想要做的: enum MyEnum { E_1, E_2 }; template <MyEnum T> class MyClass { // method to be fully specialized template <typename U> void myMethod(U value); }; // full specializa

我知道这个话题现在应该已经差不多过时了,但我对这个具体的案例感到很为难

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

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';
}
enum MyEnum
{
E_1,
E_2
};
模板
类MyClass
{
//方法要完全专业化
模板
无效值法(U值);
};
//从类模板到方法模板的完全专门化
//(或者这实际上是局部的,因为我要让T一个人呆着?)
模板
模板
void MyClass::myMethod(int值)
{

std::coutC++03[$14.7.3/18]说

在类模板的成员或出现在命名空间作用域中的成员模板的显式专门化声明中,成员模板及其某些封闭类模板可以保持非专门化,除非声明不应显式专门化类成员模板(如果其封闭类模板为也没有明确专门化

因此,您也需要专门化封闭类

像这样的东西会有用的

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

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


要么通过专门化类模板来完全专门化,要么根本不专门化。

你的回答启发了我。我很惭愧地注意到我总是得到“你必须专门化封闭类”问题:我以为我必须重新声明整个类,但这只是意味着我必须复制被专门化的方法。对吗?这有点无聊,但比我想象的要好得多!是的,现在有道理了。当我听到有人说我就在今天,我才意识到他们提到的是模板模板…真是个骗人的家伙~