模板类专业化函数调用。 C ++

时间:2015-04-30 11:09:01

标签: c++ templates template-specialization specialization

考虑这段代码。

template<class T>
class A
{
    public:
      void f(){..}
      void h(){..}
};


template<>
class A<int>
{
    public:
      void f(){// something different..}
      //void h(){..}
};

int main()
{
    A<int> obj;
    obj.h(); // I want to call A<T>::h(), but compiler erred that there is no h function in A<int>
}

有没有办法接听这个电话?还是一些解决方法?

3 个答案:

答案 0 :(得分:3)

A<T>是一个类模板,它根据任何类型名A引入一系列类TA<int>A<T>的显式特化 - 它取代了泛型类定义。这与写完没有什么不同:

class Aint {
public:
    void f(); 
};

此专业化只有一个成员函数 - f。所以当你尝试这样做时:

A<int> obj;
obj.h();

由于A<int>没有名为h的成员函数,因此无法编译。尽管两者都被命名为AA<int>A<T>不相关 - 一个不是另一个的基类,并且通用{{{ 1}} - A<T>专业化没有它们。

如果A<int>是常见的,您可以将其移动到基类中:

h

这样struct ABase { // or alternatively ABase<T> void h(); } template <typename T> class A : ABase { void f(); }; template <> class A<int> : ABase { void f(); }; 的所有实例化都会有A。也就是说,直到有人继续并添加:

h()

答案 1 :(得分:2)

根据您在专业化中更改的内容,您可能最好只为f专门设置A<int>而不是专门化整个班级:

template<class T>
class A
{
    public:
      void f(){cout << "standard";}
      void h(){cout << "standard";}
};

template<>
void A<int>::f() {cout << "specialized";}

int main()
{
    A<bool>{}.f(); //outputs standard
    A<int> obj;
    obj.f();       //outputs specialized
    obj.h();       //outputs standard
}

如果您的专业化比这更复杂,您可以将常见行为纳入基类并从中派生A

答案 2 :(得分:2)

此代码适用于我:

template<class T>
class BaseA {
public:
  void f(){...}
  void h(){...}
};

template<class T>
class A : public BaseA<T>
{
};


template<>
class A<int> : public BaseA<int>
{
    public:
      void f(){...}
      //void h(){..}
};

int main()
{
    A<int> obj;
    obj.h(); // I want to call A<T>::h(), but compiler erred that there is no h function in A<int>
}

它声明了一个由两者继承的基类。