C++ 是否访问模板参数列表中以前模板参数的typedefs?

C++ 是否访问模板参数列表中以前模板参数的typedefs?,c++,templates,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

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

#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;
}
#包括
样板
结构式打字机{
类型定义V值_类型;
};
样板
结构价值持有人{
常量静态类型名T::value\u type value=v;
};
int main(){
typedef-TypeHolder-IntTypeHolder;
持票人五名;

std::cout这是由于语法错误,您尝试使用
T::value\u type v
来获得正确的值

那么最好使用这样的方法:

template<typename T>
struct ValueHolder {
    const static typename T::value_type value;
    ValueHolder(typename T::value_type v)
    {
        ValueHolder::value = v;
    }
}
模板
结构价值持有人{
常量静态类型名T::value\u类型值;
持票人(类型名称T::value\U类型v)
{
价值持有人::价值=v;
}
}

这是由于语法错误,您尝试使用
T::value\u type v
来获得正确的值

那么最好使用这样的方法:

template<typename T>
struct ValueHolder {
    const static typename T::value_type value;
    ValueHolder(typename T::value_type v)
    {
        ValueHolder::value = v;
    }
}
模板
结构价值持有人{
常量静态类型名T::value\u类型值;
持票人(类型名称T::value\U类型v)
{
价值持有人::价值=v;
}
}

这是可能的。您缺少关键字
typename

 template<typename T, typename T::value_type v>
 struct ValueHolder { ^^^^^^^^
   ...
模板
结构值持有者{^^^^^^^^
...
您必须通知编译器
T::value\u type
是一个类型。
.

这是可能的。您缺少关键字
typename

 template<typename T, typename T::value_type v>
 struct ValueHolder { ^^^^^^^^
   ...
模板
结构值持有者{^^^^^^^^
...
您必须通知编译器
T::value\u type
是一个类型。
.

如果在编译的模板参数前加前缀
typename

template<typename T, typename T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
}
模板
结构价值持有人{
常量静态类型名T::value\u type value=v;
}

使用
typename
可以帮助编译器知道,在这种情况下,
T::
命名空间中引用的标识符
value\u type
是一种类型,而不是成员函数或变量。

如果将
typename
作为编译的模板参数的前缀:

template<typename T, typename T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
}
模板
结构价值持有人{
常量静态类型名T::value\u type value=v;
}
使用
typename
可以帮助编译器知道,在这种情况下,
T::
命名空间中引用的标识符
value\u type
是一个类型,而不是成员函数或变量。

请尝试以下操作:

template<typename T, typename T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
};
模板
结构价值持有人{
常量静态类型名T::value\u type value=v;
};
你必须加上前缀“typename”对于您的<代码> t:ValueOyType …不幸的是,因为<代码> ValueSype类型是<代码> TyBuff.<代码>成员>代码> t>代码>并不意味着C++分析器可以告诉它。它可能是实际的静态数据成员、静态方法等。因此,当访问其他命名空间/类中的完全限定类型时,必须先对其进行前缀。h
typename

尝试以下操作:

 template<typename T, typename T::value_type v>
 struct ValueHolder { ^^^^^^^^
   ...
template<typename T, typename T::value_type v>
struct ValueHolder {
    const static typename T::value_type value = v;
};
模板
结构价值持有人{
常量静态类型名T::value\u type value=v;
};

你必须加上前缀“typename”对于您的<代码> t:ValueOyType …不幸的是,因为<代码> ValueSype类型是<代码> TyBuff.<代码>成员>代码> t>代码>并不意味着C++分析器可以告诉它。它可能是实际的静态数据成员、静态方法等。因此,当访问其他命名空间/类中的完全限定类型时,必须先对其进行前缀。h
typename

您的第一个问题是结构定义末尾缺少分号。我修复了该问题并更新了更相关的错误。如果我做错了,请告诉我。您的第一个问题是结构定义末尾缺少分号。我修复了该问题并更新了更相关的错误。请让我知道我知道我做的不对。我很困惑。C++语法是如此的模糊。没关系。我很困惑。C++语法太不明确了。请给我一个教育的时刻…为什么要投票?哦,好,谢谢:……我会把答案编辑成相关的代码段,这样就更清楚了。我看到你增加了一个EX。规划和+1ed现在:)请为我提供一个教育性的时刻…为什么要向下投票?哦,好的,谢谢:-)…我将把答案编辑到相关的代码段以便更清晰。我看到你添加了一个解释,现在+1ed:)构造函数参数中没有
typename
?你没有更改代码吗?你不相信吗你也应该在参数中使用
typename
?对不起,我当时正在工作,只是忘记了在构造函数参数中使用
typename
?你没有更改代码?你不相信你也应该在参数中使用
typename
?对不起,我当时正在工作,只是忘记了在mo中使用它装饰
 template<typename T, typename T::value_type v>
 struct ValueHolder { ^^^^^^^^
   ...