C++ 模板中的一些方法

C++ 模板中的一些方法,c++,c++11,templates,template-specialization,C++,C++11,Templates,Template Specialization,我有一个类,它有一个模板专门化版本。但是,前者看不到泛型版本实现的方法。 如何使泛型版本中的所有方法在 专业版 例如: 测试.hpp #include <iostream> template <typename T> class A_base{ public: virtual void foo() = 0; }; template <typename T> class A : public A_base<T> { public:

我有一个类,它有一个模板专门化版本。但是,前者看不到泛型版本实现的方法。 如何使泛型版本中的所有方法在 专业版

例如:

测试.hpp

#include <iostream>

template <typename T>
class A_base{
public:
    virtual void foo() = 0;
};

template <typename T>
class A : public A_base<T> {
public:
    void foo() override {
        std::cout << "foo: generic type" << "\n";
    }
};

template <>
class A<int> : public A_base<int>{
public:
    void bar() {
        std::cout << "bar: int type" << "\n";
    }
};
#include "test.hpp"

int main(){
    A<int> a;
    a.foo(); // expected "foo: generic type"
    a.bar(); // expected "bar: int type"
}
#包括
模板
甲级基础{
公众:
虚拟void foo()=0;
};
模板
A类:公共A_基地{
公众:
void foo()重写{
标准::cout
为什么
A
A看不见
foo()

通过为
T=int
专门化类模板
A
,您定义了当
T
对应于
int
时类模板
A
的方式,并且您提供的专门化(即:
A
)没有名为
foo
的成员(但主模板有)

可以单独专门化类模板的成员函数。因此,您可以简单地专门化类模板
T
的成员函数
bar
,而不必专门化整个类模板:

template <>
void A<int>::bar(){
        std::cout << "bar: int type" << "\n";
}
模板
void A::bar(){

std::我能理解为什么这个替代方案有效,但我不明白为什么我必须在部分专用版本中重新定义泛型版本的每个方法才能使其有效。@DanielSaad考虑为给定类型专门化类模板,如“重新定义”只针对该类型的类。好吧,但这对我来说似乎很不直观。也许我应该将泛型代码放在基类中。@DanielSaad想象一下,您的类模板的一个成员函数对泛型类型
T
使用了某个操作,但此操作对
int
不可用。然后您可以可以为
int
专门化该模板类,而无需定义该成员函数。@DanielSaad也可以在您希望提供仅对特定类型有意义的附加成员函数时使用。然后,为该特定类型专门化该类模板,并编写该附加成员函数的实现h不是主模板的一部分。请记住,例如,
std::strings
int
是完全不同的。因为专业化完全独立于模板,所以它是专业化的。这意味着在此类情况下需要更多的工作,但在其他情况下也允许更大的灵活性。