我在模板专业化方面遇到了一些麻烦.我已经找到了其他答案,并认为我在这个线程中找到了解决方案 - 在类定义之外的部分模板特化 - 然而事实证明这并不能解决我的问题.
我试图基于枚举值做一些模板专业化,以消除不必要的运行时多态性的需要.当我在类体中定义模板函数时,它可以正常工作,但是当我将定义移到类模板之外时,编译器无法匹配签名.
我的实际场景是与使用命名对象的API连接,我使用枚举值表示每个对象类.对象彼此不直接相关,但它们具有非常相似的资源管理/操作机制.我最初尝试使用特征,但因为我有时需要使用完全不同的函数签名,所以特征并没有像我希望的那样有效.
无论如何,这是我面临的问题的一个减少的例子.
狗吠工作,因为它是在类定义中定义的,但猫喵没有,因为它找不到喵喵的声明.如果我合并定义和声明cat meow将起作用.
有没有办法以这种方式部分指定模板?原因是我希望将外部API的依赖关系保存到源文件而不是头文件中.
enum class AnimalType { Dog, Cat, };
template<AnimalType Type> struct A;
template<>
struct A<AnimalType::Dog>
{
// OK
void bark() { std::cout << "woof"; }
};
template<>
struct A<AnimalType::Cat>
{
void meow();
};
// Cannot match
template <>
void A<AnimalType::Cat>::meow()
{
}
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会4.9抱怨
scratchpad/animal.h:105: error: template-id 'meow<>' for 'void <(AnimalType)1>::meow()' does not match any template declaration
void A<AnimalType::Cat>::meow()
谢谢