Я хочу специализироваться 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
Я предполагаю, что это нарушение одного правила определения, а компилятор просто «выбрал один» для выполнения, но я не совсем уверен в этой оценке. –
Первый нельзя использовать, так как 'T' не может быть выведено. В последнее время [что приводит к плохой работе программы] (https://timsong-cpp.github.io/cppwp/temp.class.spec#match-3). –
Я думаю, что это не первая специализация, потому что он не может решить тип T. gcc дал мне сообщение об ошибке, компилирующее ваш код: параметры шаблона не выводятся в частичной специализации. Если я явно укажу тип, используемый в шаблоне (int вместо T), он работает, очевидно, не то, что вы хотели. – Klaus