C++ 源头而不是头中的类的部分专业化
C++ Partial-specialization of class in source not header
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>()
不同
相关文章:
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 类模板的成员功能的定义在单独的TU中完全专业化
- 部分专业化和嵌套模板
- 模板专业化可以进入我的.cpp吗?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 部分专业化和对标准::void_t<>的需求
- "专业化不参与超载"
- 特定好友功能专业化
- 是否可以混合使用SFINAE和模板专业化?
- 为什么在班级专业化上会出现错误?
- enable_if如何帮助选择类模板的专业化?
- std::initializer_list可以专业化吗?
- 派生类中纯虚拟基方法的专业化
- "expected a '>'"类模板专业化?
- Clang不会编译GCC会编译的模板专业化
- 我可以用clang AST从模板专业化中获得默认的模板参数吗
- 函数模板部分专业化-有什么解决方法吗
- 类模板的编译错误,但其专业化除外
- C++ 源头而不是头中的类的部分专业化