У меня есть ситуация, когда у меня есть такие вложенные структуры:
struct A
{
struct B
{};
};
И у меня есть некоторый шаблон кода, который должен знать тип OUTER (в данном случае, ‘A’).
Поэтому я пытаюсь написать шаблонную функцию, которая может выводить внешний тип, и это выглядит так:
template<typename T>
void func(typename T::B item)
{}
int main()
{
A::B item;
func(item); // Error here because "candidate template ignored: couldn't infer template argument 'T'"return 0;
}
Он не компилируется, и причина указана в комментарии выше.
Теперь я, конечно, мог бы упростить шаблон до чего-то подобного, но, как вы можете видеть ниже, он не удовлетворяет моим требованиям к знанию «внешнего» типа, то есть А.
template<typename T>
void func(typename T item)
{
// Oops, I now have the complete type of A::B but I have a
// specialized function that needs the A without the B as the type parameter
someOtherFunc<???>(...); // The ??? needs to be type A only, without the B
}
Вы можете добавить typedef A outerType;
в ваш класс B.
Тогда реализация func может быть:
#include <iostream>
struct A{
struct B {
typedef A outerType;
};
};
template <class T>
void func( T f)
{
typedef typename T::outerType outerType;
outerType a;
someotherfunc(a);
}
int main ()
{
A::B item;
func(item);
return 0;
}
Тогда, конечно, каждый ваш внутренний класс должен назвать свой внешний тип externalType, чтобы func работал с внешним типом.