2014-11-26 1 views
1

Это минимальный код, который я не могу исправить:Явная специализация шаблона вложенного класса в шаблоне класса

template<typename T> 
class A { 
    template<typename S> 
    class B{ 

    }; 
    template<> 
    class B<int> { 

    }; 
}; 

при компиляции я получаю

error: explicit specialization in non-namespace scope 'class A<T>' 

Что я делаю не так? Как я могу это исправить?

EDIT: Я видел некоторые другие ответы, но от того, что они предложили, я должен сделать это:

template<typename T> 
class A { 
    template<typename S> 
    class B{ 

    }; 
}; 
template<typename T> 
class A<T>::B<int> { 

}; 

Но это не работает, либо ...

+0

нет, вы не можете специализироваться вложенные шаблоны –

ответ

2

К сожалению, эта частичная специализация недействительна C++.

Вы можете увидеть форму в своем примере в дикой природе, потому что MSC поддерживает ее как расширение.

Вот подход, который демонстрирует, как вы можете удалить зависимость родительского класса:

namespace Imp { 
template <typename S> class B {}; 
template <> class B<int> {}; 
} 

template <typename T> class A { 
public: 
    template <typename S> using B = Imp::B<S>; 
};