【发布时间】:2020-08-07 06:34:16
【问题描述】:
我正在尝试探索模板的部分专业化以构建特征系统。不幸的是,我无法让全部工作正常进行。我创建了最简单的模型来展示什么不起作用。我什至不清楚我是否正在尝试不受支持的东西(实际上我看到了相同性质的例子,但细节是魔鬼)。
我只是在创建一个小示例,其中我有两个枚举,并希望根据两者的组合以不同的方式创建一个字符串。当然,这只是一个演示问题的虚拟示例,在这种情况下,同样的事情可以通过许多其他方式来完成。
#ifndef TESTTRAITS_H_
#define TESTTRAITS_H_
#include <string>
using namespace std;
enum MovementType {
WALKS = 0, SWIMS = 1
};
enum AnimalType {
DOG = 0, CAT = 1, DOLPHIN = 2
};
template<AnimalType A, MovementType B>
struct movementAnimal {
static const string quality;
};
template<AnimalType A>
struct movementAnimal<A,WALKS> {
static const string quality;
};
template<AnimalType A>
struct movementAnimal<A,SWIMS> {
static const string quality;
};
#endif /* TESTTRAITS_H_ */
现在我写静态变量的赋值
#include "TestTraits.h"
template<>
const string movementAnimal<DOLPHIN, WALKS>::quality = "Not capable";
template<>
const string movementAnimal<DOLPHIN, SWIMS>::quality = "Excellent";
template<AnimalType A>
const string movementAnimal<A, SWIMS>::quality = "Decent";
template<AnimalType A>
const string movementAnimal<A, WALKS>::quality = "Very Well";
还有一个小的 main 函数
#include <iostream>
using namespace std;
#include "TestTraits.h"
int main() {
cout << movementAnimal<DOLPHIN,WALKS>::quality << endl;
cout << movementAnimal<DOG,WALKS>::quality << endl;
return 0;
}
如果我编译我得到错误:
/src/TestProject.cpp:15: 未定义对 `movementAnimal::quality[abi:cxx11]' 的引用 collect2: 错误: ld 返回 1 个退出状态>
如果我删除对 motionAnimal
我知道它没有消化部分模板规范
template<AnimalType A>
const string movementAnimal<A, WALKS>::quality = "Very Well";
我不知道为什么以及是否有可能使该模式起作用。
【问题讨论】:
-
这段代码在GCC上运行,你用什么编译器?
-
我cannot reproduce it。你是怎么编译源码的?第二段代码是单独的源文件吗?
标签: c++ templates template-meta-programming