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+中为模板化类中的单个方法创建专门化+;?_C++_Templates_Template Specialization - Fatal编程技术网

C++ 如何在C+中为模板化类中的单个方法创建专门化+;?

C++ 如何在C+中为模板化类中的单个方法创建专门化+;?,c++,templates,template-specialization,C++,Templates,Template Specialization,已经提出了很多问题,它们与我将要在这里提出的问题相似,但我认为它们并不相同 我有一个模板类: namespace app { template <typename T> class MyCLass { public: void dosome(); void doother(); } } /*ns*/ 但是编译器告诉我,我正在尝试在不同的名称空间中创建专门化 所以当我有这样的代码时: app::MyCLass<int> a; app::MyCLass<cha

已经提出了很多问题,它们与我将要在这里提出的问题相似,但我认为它们并不相同

我有一个模板类:

namespace app {
template <typename T>
class MyCLass {
public:
  void dosome();
  void doother();
}
} /*ns*/
但是编译器告诉我,我正在尝试在不同的名称空间中创建专门化

所以当我有这样的代码时:

app::MyCLass<int> a;
app::MyCLass<char> b;
a.dosome(); // This must call the generic template definition
b.dosome(); // This must call the specialization
a.doother(); // This must call the generic template definition
b.doother(); // This must call the generic template definition
app::MyCLass a;
app::MyCLass b;
a、 dosome();//这必须调用通用模板定义
b、 dosome();//这必须称为专门化
a、 doother();//这必须调用通用模板定义
b、 doother();//这必须调用通用模板定义

在其他问题中,我看到人们创造了整个班级完全不同的专业。但是我只想要一个方法的专门化。

一个选项是标记分派:

template <typename T>
class MyClass {
public:
  void dosome() { dosome_impl( T() ); }

private:

  void dosome_impl(char) { /* char stuff */ }  
  template<typename U>
  void dosome_impl(U) { /* usual stuff */ }
};
还有一个是将单个函数移动到可以专门化的基类:

template <typename T>
struct MyClass_base {
    dosome() { /* usual stuff */ }
};

template<>
struct MyClass_base<char> {
    dosome() { /* char stuff */ } 
};

template <typename T>
class MyClass : private MyClass_Base<T> {
public:
    // nothing special here
};
模板
结构MyClass_基{
dosome(){/*常用内容*/}
};
模板
结构MyClass_基{
dosome(){/*char stuff*/}
};
模板
类MyClass:私有MyClass_基{
公众:
//这里没什么特别的
};

一个选项是标签发送:

template <typename T>
class MyClass {
public:
  void dosome() { dosome_impl( T() ); }

private:

  void dosome_impl(char) { /* char stuff */ }  
  template<typename U>
  void dosome_impl(U) { /* usual stuff */ }
};
还有一个是将单个函数移动到可以专门化的基类:

template <typename T>
struct MyClass_base {
    dosome() { /* usual stuff */ }
};

template<>
struct MyClass_base<char> {
    dosome() { /* char stuff */ } 
};

template <typename T>
class MyClass : private MyClass_Base<T> {
public:
    // nothing special here
};
模板
结构MyClass_基{
dosome(){/*常用内容*/}
};
模板
结构MyClass_基{
dosome(){/*char stuff*/}
};
模板
类MyClass:私有MyClass_基{
公众:
//这里没什么特别的
};

您可以随心所欲:

//标题

namespace My
{

template <typename T>
class MyClass {
public:
    void dosome();
    void doother();
};

template <typename T> void MyClass<T>::dosome() {}
template <typename T> void MyClass<T>::doother() {}

template<> void MyClass<char>::dosome();

}
名称空间我的
{
模板
类MyClass{
公众:
void dosome();
void doother();
};
模板void MyClass::dosome(){}
模板无效MyClass::doother(){}
模板void MyClass::dosome();
}
//cpp或在标题中

template<>
void My::MyClass<char>::dosome() {
    std::cout << "specialization" << std::endl;
}
模板
void My::MyClass::dosome(){

你可以做你想做的事:

//标题

namespace My
{

template <typename T>
class MyClass {
public:
    void dosome();
    void doother();
};

template <typename T> void MyClass<T>::dosome() {}
template <typename T> void MyClass<T>::doother() {}

template<> void MyClass<char>::dosome();

}
名称空间我的
{
模板
类MyClass{
公众:
void dosome();
void doother();
};
模板void MyClass::dosome(){}
模板无效MyClass::doother(){}
模板void MyClass::dosome();
}
//cpp或在标题中

template<>
void My::MyClass<char>::dosome() {
    std::cout << "specialization" << std::endl;
}
模板
void My::MyClass::dosome(){


std::难道你必须专门化整个类,而不仅仅是一个方法吗?你必须首先专门化整个类。但这样我必须重新定义所有的方法实现…我真的必须为
doother
?写代码吗?对我来说似乎很奇怪…是的,这就是模板专门化对类的作用你必须专门化整个类,而不仅仅是一个方法你必须首先专门化整个类。但这样我必须重新定义所有的方法实现…我真的必须为
doother
?编写代码吗?我觉得很奇怪…是的,模板专门化就是这样工作的classes@Andry很多人都相信,但是kins说没有上帝。我将置身于那场辩论之外:)@Andry许多人相信这一点,但Dawkins说没有上帝。我将置身于那场辩论之外:)我一直忘了这是允许的。+1这实际上是我试图做的,但你在标题和实现中都使用专门化语法???你可以实现所有东西如果需要,在标题中,但要使用语法
My::Myclass
,必须声明它(专门化)在之前的名称空间中。因此,基本上你是在声明部分专门化,然后实现它…我一直忘记这是允许的。+1所以这实际上是我试图做的,但是你在头和实现中都使用专门化语法???如果你想的话,你可以实现头中的所有内容,但是使用语法
My::Myclass
,之前必须在名称空间中声明它(专门化)。因此基本上是声明部分专门化,然后实现它。。。