2015-12-03 3 views
3

У меня есть следующий фрагмент кода, который должен объявить базовую структуру, а затем объявить структуру шаблона, наследующую от нее. Тогда структура частично 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 (со специальными методами), которые имеют общие методы?

ответ

5

Поскольку базовый класс зависит от параметров шаблона, базовые элементы не проверяются при поиске неквалифицированного имени.

К счастью, исправить это легко: просто префикс базовый элемент обращается с this->:

this->m_pair.first += this->m_pair.second; 
this->m_pair.first -= this->m_pair.second; 

Это будет взгляд в базовом классе, так что элемент будет найден.

Неквалифицированный поиск работает в MSVC, поскольку этот компилятор является несоответствующим во многих аспектах реализации шаблона.

Смежные вопросы