Я пытаюсь изучить частичную специализацию шаблонов, чтобы построить систему черт. К сожалению, я не могу заставить работать полную версию. Я создал простейшую модель, чтобы показать, что не работает. Мне даже не ясно, пробую ли я что-то, что не поддерживается (на самом деле я вижу несколько примеров того же характера, но дьявол кроется в деталях).
Я просто создаю небольшой пример, в котором У меня есть два перечисления, и я хотел бы создать строку по-разному в зависимости от их комбинации. Конечно, это всего лишь фиктивный пример, показывающий проблему, то же самое в этом случае можно сделать многими другими способами.
#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_ */
Теперь я пишу присвоение переменной stati c
#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";
И небольшая основная функция
#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: undefined ссылка на `motionAnimal <(AnimalType) 0, (MovementType) 0> :: quality [abi: cxx11] 'collect2: error: ld вернула 1 статус выхода>
Если я удалю ссылку на motionAnimal :: quality, тогда он компилируется отлично.
Я понимаю, что он не переваривает частичную спецификацию шаблона
template<AnimalType A>
const string movementAnimal<A, WALKS>::quality = "Very Well";
Я не знаю, почему и возможно ли, чтобы этот шаблон работал.