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

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

Foo.h

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

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.

当我编译时,部分特化的构造函数抛出错误

nested name specifier 'Foo::' for declaration does not refer into a class, class template or class template partial specialization

我想我需要在某处声明此 partially-specialized class,但我不想让 re-declaring 保持不变 class ... 即我不想将以下内容放入 header 文件中:

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();
}

但这也不编译。

本质上,在没有 re-declaring class 的所有内部函数的情况下声明 class 的偏特化的语法是什么?

你说:

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

只有你专门化了整个 class,你才能使用它。您不能只特化 class.

的一个成员函数

以下应该有效:

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>()

不同