2

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.

当我编译时,部分专用的构造函数会引发错误

用于声明的嵌套名称说明符 '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();
}

但这也不能编译。

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

4

2 回答 2

4

你说:

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()
{
}
于 2015-01-07T15:58:57.573 回答
4

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

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

于 2015-01-07T16:29:54.547 回答