2017-02-08 20 views
0

У меня есть шаблон, который наследуется от другого шаблона, сам по себе в качестве параметра шаблона второго шаблона. Унаследовали шаблон определяет статическую функцию:Шаблон специализации с шаблоном для статической функции

template<class T> class A 
{ 

public: 

    static void foo(); 
}; 

template<class T> class B : public A<B> 
{ 

}; 

Теперь я хочу, чтобы реализовать статическую функцию для класса А специализированного с B, но B не специализирована. Но я не могу понять, как объявить шаблон. Я даже не уверен, что это возможно. Моя первая попытка была:

template<class T> void A<B<T>>::foo() 
{ 

} 

Но это дает ошибку:

"Nested name specifier 'A<B<T>>::" for declaration does not refer into a class, class template or class template partial specialization" 

Я пробовал разные вещи, как добавляя «шаблон <>» перед, но ни один из тех, кто работал. Я могу скомпилировать это:

template<> void A<B<int>>::foo() 
{ 

} 

Как это:

template<class T> void A<T>::foo() 
{ 

} 

Это попытка частичной специализации? Мое первое впечатление - нет (нет шаблонов с несколькими параметрами, где я хочу специализироваться на одном из них). Скорее, я хочу специализировать шаблон с другим шаблоном, который не является специализированным. Возможно ли это, и если да, то какой правильный синтаксис?

+0

Спасибо, я только что исправил. Я хочу реализовать статическую функцию для специализации A с B, но без специализации B. – sweatervest

ответ

0

Это действительно частичная специализация. Вы не можете частично специализироваться только на методе, вы должны частично специализировать весь класс. См. this answer. Вы можете попытаться реализовать foo в отдельной вспомогательной структуре и частично специализируясь на этой структуре.

Вот пример использования вспомогательной структуры.

#include <iostream> 

template<class T> struct t_helper 
{ 
    static void foo() 
    { 
     std::cout << "Not B<T>\n"; 
    } 
}; 

template<class T> class A 
{ 

public: 
    static void foo() { 
     t_helper<T>::foo(); 
    } 
}; 

template<class T> class B {}; 

// Specialize the behavior of A<T>::foo() for all B types 
template<class T> 
struct t_helper<B<T>> 
{ 
    static void foo() 
    { 
     std::cout << "Is B<T>\n"; 
    } 
}; 

int main() 
{ 
    A<int>::foo(); // Prints "Not B<T>\n" 
    A<B<int>>::foo(); // Prints "Is B<T>\n" 
    return 0; 
} 
+0

Спасибо! В итоге я только частично специализировался на классе. – sweatervest

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

  • Нет связанных вопросов^_^