访问模板参数列表中以前模板参数的typedef?

时间:2011-09-13 10:59:19

标签: c++ templates

我想知道是否可以访问模板参数列表中后面的模板参数中作为先前模板参数给出的类型的类型定义,如下所示:

#include <iostream>

template<typename V>
struct TypeHolder {
    typedef V value_type;
};

template<typename T, T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
};

int main() {
    typedef TypeHolder<int> IntTypeHolder;
    typedef ValueHolder<IntTypeHolder,5> Five;

    std::cout << Five::value << std::endl;

    return 0;
}

当我编译上面的例子时,我收到以下错误:

  

damian @ damian-HP-EliteBook-8440p:〜$ g ++ -o cpptest test.cpp
  test.cpp:8:25:错误:'T :: value_type'不是类型

这是由于语法错误还是我试图在c ++中不可能做到的?

4 个答案:

答案 0 :(得分:4)

可能。您缺少关键字typename

 template<typename T, typename T::value_type v>
 struct ValueHolder { ^^^^^^^^
   ...

您必须通知编译器T::value_type是一种类型。 Demo

答案 1 :(得分:1)

如果您在typename前加上模板参数,则会编译:

template<typename T, typename T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
}

typename的使用有助于编译器知道在这种情况下value_type命名空间中引用的标识符T::是一个类型而不是成员函数或变量。

答案 2 :(得分:1)

尝试以下方法:

template<typename T, typename T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
};

您必须在T:value_type前加上“typename”前缀...不幸的是,因为value_typetypedef的{​​{1}}成员并不意味着C ++解析器可以告诉。它可能是一个实际的静态数据成员,静态方法等。因此,当访问其他名称空间/类中的完全限定类型时,您必须在其前面添加T

答案 3 :(得分:0)

这是由于语法错误,您尝试使用T::value_type v尝试获取正确的值是什么?

然后更好地使用类似的东西:

template<typename T>
struct ValueHolder {
    const static typename T::value_type value;
    ValueHolder(typename T::value_type v)
    {
        ValueHolder::value = v;
    }
}