【发布时间】:2015-03-05 13:41:46
【问题描述】:
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();
}
但这也不能编译。
本质上,声明一个类的部分特化而不重新声明该类的所有内部函数的语法是什么?
【问题讨论】:
-
部分特化仍然是一个模板;你为什么要把它放在一个 .cpp 文件中?无论如何,问题似乎更多是关于如何在不替换整个类的情况下部分专门化类模板的成员函数。不幸的是,这是不可能的。您不能部分特化函数模板,其中包括类模板的成员函数。
-
您使用
Foo_Beta显示的示例不是部分专业化。部分专业化将是例如template<typename A> class Foo<A, Beta> { ... }; -
@SebastianRedl:我怀疑可能是这样。我想要的主要是一个干净的“如果您以这种方式获得 Beta 构造,则以另一种方式获得 Beth,A 是 Alpha 还是 Aleph 并不重要。”但是,除了构造函数之外,该类对于它将接收的任何组合 A、B 的行为都是相同的。
标签: c++ partial-specialization template-classes