У меня есть следующий фрагмент кода, который должен объявить базовую структуру, а затем объявить структуру шаблона, наследующую от нее. Тогда структура частично specilised.C++ template specialization & inheritance
#include <utility>
#include <iostream>
template<class A, class B>
struct Parent {
std::pair<A, B> m_pair;
void print() {
std::cout << m_pair.first << ", " << m_pair.second << "\n";
}
};
template <class A, class B>
struct Some : public Parent<A, B> {
Some(A a, B b) : Parent<A, B>({ {a, b} }) {}
void add() {
m_pair.first += m_pair.second;
}
};
template <class B>
struct Some<B, float> : public Parent<B, float> {
Some(B a, float b) : Parent<B, float>({ {a, b} }) {}
void add() {
m_pair.first -= m_pair.second;
}
};
int main() {
Some<int, float> s(4, 42);
s.add();
s.print();
return 0;
}
Когда я скомпилирую его в Visual Studio 2015, все компилируется просто отлично и работает так, как ожидалось. Однако, когда я компилирую с GCC 5.2.1 или clang 3.6, я получаю следующую ошибку:
untitled.cpp: In member function ‘void Some<A, B>::add()’:
untitled.cpp:17:9: error: ‘m_pair’ was not declared in this scope
m_pair.first += m_pair.second;
^
untitled.cpp: In member function ‘void Some<B, float>::add()’:
untitled.cpp:24:9: error: ‘m_pair’ was not declared in this scope
m_pair.first += m_pair.second;
Что случилось? Однако, когда я ссылаюсь на m_pair
как Parent<A, B>::m_pair
, он работает в GCC и clang.
Каков правильный способ определения specilised template clasess (со специальными методами), которые имеют общие методы?