Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向类型名成员的指针_C++_Templates_Typename_Pointer To Member_Gcc4.7 - Fatal编程技术网

C++ 指向类型名成员的指针

C++ 指向类型名成员的指针,c++,templates,typename,pointer-to-member,gcc4.7,C++,Templates,Typename,Pointer To Member,Gcc4.7,考虑这一点: template < typename VectorType > void ff() { // This passes. typedef typename VectorType::value_type VV; typedef int VV::* MM; // This FAILS!?? typedef int typename VectorType::value_type::* MMM; } 模板 void ff() { //

考虑这一点:

template < typename VectorType >
void ff()
{
    // This passes.
    typedef typename VectorType::value_type VV;
    typedef int VV::* MM;

    // This FAILS!??
    typedef int typename VectorType::value_type::* MMM;
}
模板
void ff()
{
//这就过去了。
typedef typename VectorType::value_type VV;
typedef int VV::*MM;
//这失败了!??
typedef int typename向量类型::值类型::*MMM;
}
为什么第二个失败?在一个typedef语句中获得所需typedef的正确方法是什么


我的编译器是GCC-4.7.2。

正如注释中所指出的,您有一个
类型名
,它不应该是:

typedef int typename VectorType::value_type::* MMM;
应该是:

typedef int VectorType::value_type::* MMM;
typename
用于当模板中有
a::b
时,
a
取决于模板参数,
b
是一种类型。在这种情况下,您必须使用
typename a::b
将此事实传达给编译器


另一方面,你在做
a::b::*
,这清楚地表明
b
必须是一种类型,因此
typename
不能在这里使用。

它是否与
typedef int-VectorType::value\u-type:*MMM
一样工作?@KerrekSB我认为你应该把这变成一个答案,
typename
显然是多余的(在
的右边没有标识符)。@Angew:它不仅仅是多余的。在那里使用
typename
是不正确的。@KerrekSB哦,当然:)请将其转换为答案。我只是猜测:-)这看起来像是“需要一个typename”的情况之一,因此不需要消除歧义。但我不确定。