如何在C++中的另一个模板函数中使用属于模板化类的嵌套类型?



我正在设置一个函数,该函数基于元组类型和函子结构For初始化元组,该函数具有INDEX保留编译时索引的size_t模板参数。此函子还可能依赖于其他模板参数T...。因此,函子存在于保存这些模板参数的其他结构(在本例中TClass)。

初始化函数(此处称为Bar)具有template<std::size_t> class模板参数,以确保使用的类实际上可以存储索引。

虽然当我从非模板函数调用它时,我想出的设计工作正常,但如果函数的模板T2确实确定了包装器TClass的模板参数,它就不会编译。

以下是包裹在TClass中的函子For的定义:

#include <cstdlib>
template <typename T> struct TClass {
template<std::size_t INDEX> struct For {
void operator()() {}
};      
};

以下是我想使用的函数调用:

template <template<std::size_t> class FOR> void bar() {
//...
} 
template <typename T> void foo() {  
bar<TClass<T>::For>(); //Does not compile
}
int main() {
bar<TClass<int>::For>(); //Works
foo<int>(); 
return 0;
}

错误foo调用的编译器输出为:

error: dependent-name ‘TClass<T>::For’ is parsed as a non-type, but instantiation yields a type
Bar<TClass<T>::For>(); //Does not compile

我知道依赖类型名称通常必须在前面加上typename但这对于第一个bar调用也不是必需的。我认为这是因为模板参数只能解释为一种类型。所以我想也许typename会导致正确的编译,但如果我foo更改为

template <typename T> void foo() {  
bar<typename TClass<T>::For>(); //Does not compile
}

我得到:

error: ‘typename TClass<int>::For’ names ‘template<long unsigned int INDEX> struct TClass<int>::For’, which is not a type
Bar<typename TClass<T>::For>(); //Does not compile

我还提出了一个设计,其中TClass()运算符取决于模板INDEX这也很好用,因为不再需要使用嵌套类型。它看起来像这样:

#include <cstdlib>
template <typename T> struct TClass {
template<std::size_t INDEX> void operator()() {}
};
template <typename FOR> void bar() {
//...
} 
template <typename T> void foo() {  
bar<TClass<T>>(); //Does compile
}

显然,在类型的模板由函数的模板参数确定的函数中,不可能使用依赖类型名称,但为什么呢?我如何正确实现这一点?为了使使用类型特征编写未来的类型检查更容易,如果我可以使用函子,我更喜欢它。

编译器无法知道TClass<T>::For在模板实例化的第一阶段引用模板。它需要一些关键字template帮助。修复:

template <typename T> void foo() {  
bar<TClass<T>::template For>(); 
}

最新更新