专门研究模板中的一些方法

时间:2018-01-19 19:19:06

标签: c++ c++11 templates template-specialization

我有一个具有模板特化版本的类。但是,前者无法看到通用版本实现的方法。 如何使通用版本中的所有方法都可见 专业版?

例如:

test.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";
    }
};

TEST.CPP

#include "test.hpp"

int main(){
    A<int> a;
    a.foo(); // expected "foo: generic type"
    a.bar(); // expected "bar: int type"
}

为什么A<int> a无法看到foo()

1 个答案:

答案 0 :(得分:2)

  

为什么A<int>无法看到foo()

通过为A<T>专门化类模板T = int,您可以定义A<T>T对应时类模板int的位置,以及该专业化(即:A<int>)您提供的没有成员名为foo(但主要模板会这样做)。

可以单独专门化类模板的成员函数。因此,您可以简单地为bar专门化类模板T的成员函数T = int,而不是为整个类模板执行此操作:

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