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
,之前必须在名称空间中声明它(专门化)。因此基本上是声明部分专门化,然后实现它。。。