如何在 C++ 的另一个模板函数中使用属于模板化 class 的嵌套类型?
How can I use a nested type belonging to a templated class in another template function in C++?
我正在设置一个函数,该函数根据元组类型和具有 size_t 模板参数 INDEX
的仿函数结构 For
来初始化元组,以保留编译时间指数。这个仿函数也可能依赖于其他模板参数 T...
。因此,仿函数存在于保存这些模板参数的其他结构中(本例中为 TClass
)。
初始化函数(这里叫Bar
)有一个template<std::size_t> class
模板参数来确保使用的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
的 ()
-operator 取决于模板 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>();
}
我正在设置一个函数,该函数根据元组类型和具有 size_t 模板参数 INDEX
的仿函数结构 For
来初始化元组,以保留编译时间指数。这个仿函数也可能依赖于其他模板参数 T...
。因此,仿函数存在于保存这些模板参数的其他结构中(本例中为 TClass
)。
初始化函数(这里叫Bar
)有一个template<std::size_t> class
模板参数来确保使用的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
的 ()
-operator 取决于模板 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>();
}