我想知道是否可以访问模板参数列表中后面的模板参数中作为先前模板参数给出的类型的类型定义,如下所示:
#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 ++中不可能做到的?
答案 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_type
是typedef
的{{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;
}
}