C++ 源头而不是头中的类的部分专业化

C++ Partial-specialization of class in source not header

本文关键字:专业化 源头 C++      更新时间:2023-10-16

Foo.h

template<typename A, typename B>
class Foo{
public:
  Foo();
  /*..*/
};

福.cpp

template<typename A, typename B>
Foo<A, B>::Foo(){/*...*/}
template<typename A>
Foo<A, Beta>::Foo(){/* some specialized construction */} //<- this doesn't work.
template<>
Foo<Alpha, Beta>::Foo(){/*...*/} // <-will work, but I want partial specialization.

当我编译时,部分专用的构造函数抛出一个错误

嵌套名称说明符 'Foo::' 表示声明不引用类、类模板或类模板部分专用化

我想我需要在某个地方声明这个部分专业化的类,但我不想继续重新声明同一个类......即我不想在头文件中放入以下内容:

template<typename A>
class Foo_Beta : public Foo<A, Beta>{
public:
  Foo_Beta();
}
//in cpp
template<typename A>
Foo_Beta<A>() : Foo<A, Beta>() {/**specialized constructor stuff**/}

因为那样我就无法构造使用 Foo_Beta 构造函数的 Foo()。

我试过了

template<typename A>
class Foo<A,Beta> : public Foo<A, Beta>{
public:
  Foo();
}

但这也不能编译。

从本质上讲,声明一个类的部分专用化而不将所有内部函数重新声明给该类的语法是什么?

你说:

template<typename A> Foo<A, Beta>::Foo(){/* some specialized construction */} //<- this doesn't work.

只有当您专门化整个类时,您才能使用它。不能只专攻类的一个成员函数。

以下方法应该有效:

template<typename A> class Foo<A, Beta>
{
   Foo();
};
template<typename A> 
Foo<A, Beta>::Foo()
{
}

正如其他人提到的 - 你不能部分地专门化一个功能。但是,您可以将模板函数中的工作推迟到专门的实现函数,这确实会产生部分专用化的效果,例如:

template<class X>
X make_a_B()
{
    return X();  // default implementation
}
template<>
Beta make_a_B<Beta>()
{
    Beta b;
    // do custom things with b...
    return b;  // fully specialised for Beta, everything else uses default case.
}
template<class X>
X make_an_A()
{
    return X();
}
template<typename A, typename B>
class Foo{
public:
    Foo()
    : _myA( make_an_A<A>() )
    , _myB( make_a_B<B>() )
    {}
    /*..*/
    A _myA;
    B _myB;
};

Foo<Alpha, Beta>()现在的行为将与Foo<Alpha, Gamma>()不同