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

问题描述 投票:4回答:1

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

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

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

以下是For中包含的仿函数TClass的定义:

#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
}

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

c++ templates compiler-errors inner-classes
1个回答
4
投票

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

template <typename T> void foo() {  
    bar<TClass<T>::template For>(); 
}
© www.soinside.com 2019 - 2024. All rights reserved.