2017-02-14 5 views
0

Я хочу специализироваться STRUCT B с типом, который определен в другой структуры А.шаблона структуры специализации с использованием TypeName ::

можно увидеть MWE вниз в пост.

Сначала я удивлен, что две специализации B могут существовать вместе. Я добавил второй, чтобы показать проблему. Если удалено, код не видит соответствующей специализации для B. Я бы предпочел сохранить только первую специализацию.

Итак, мои вопросы:

  • Почему две специализации B могут существовать вместе?
  • Почему первый не применяется в создании экземпляра main?

definitions.h:

template <class T> 
class X {}; 

template <class T> 
class Xitem {}; 


template <class T> 
struct A; 

template <class T> 
struct A< X<T> > { 
    typedef Xitem<T> Titem; 
}; 

template <class T> 
struct B; 

template <class T>//I need this one only 
struct B< typename A< X<T> >::Titem > { 
    static void foo() { 
     std::cout << "foo 1" << std::endl; 
    } 
}; 

template <class T> 
struct B< Xitem<T> > { 
    static void foo() { 
     std::cout << "foo 2" << std::endl; 
    } 
}; 

main.cpp:

#include "definitions.h" 

int main(int argc, char *argv[]) { 

    B< A< X<int> >::Titem >::foo(); 
} 

Выход: "Foo 2" Использование Xcode 7

+0

Я предполагаю, что это нарушение одного правила определения, а компилятор просто «выбрал один» для выполнения, но я не совсем уверен в этой оценке. –

+1

Первый нельзя использовать, так как 'T' не может быть выведено. В последнее время [что приводит к плохой работе программы] (https://timsong-cpp.github.io/cppwp/temp.class.spec#match-3). –

+1

Я думаю, что это не первая специализация, потому что он не может решить тип T. gcc дал мне сообщение об ошибке, компилирующее ваш код: параметры шаблона не выводятся в частичной специализации. Если я явно укажу тип, используемый в шаблоне (int вместо T), он работает, очевидно, не то, что вы хотели. – Klaus

ответ

0

Ответы на вопросы были даны в комментариях. Благодарю.

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