C++ C++;使用别名访问嵌套类型(使用vs typedef)

C++ C++;使用别名访问嵌套类型(使用vs typedef),c++,gcc,c++11,alias,using,C++,Gcc,C++11,Alias,Using,今天,我们发现了一个令人困惑的C++11别名声明行为。 以下是一个例子: template<typename T> struct Q { typedef T t; }; template<typename T> void foo(Q<T> q) { using q_t = Q<T>; //typedef Q<T> q_t; // if we uncomment this and comment 'using'

今天,我们发现了一个令人困惑的C++11别名声明行为。 以下是一个例子:

template<typename T>
struct Q
{
    typedef T t;
};

template<typename T>
void foo(Q<T> q)
{
    using q_t = Q<T>; 
    //typedef Q<T> q_t; // if we uncomment this and comment 'using' the example compiles
    typename q_t::t qwe; // <<<<<<<<<< Error: no type named ‘t’ in ‘using q_t = struct Q<T>’
}

int main(int argc, char *argv[])
{
    Q<int> q;
    foo(q);
    return 0;
}
模板
结构Q
{
类型定义T;
};
模板
无效foo(Q)
{
使用q_t=q;
//typedef Q_t;//如果我们取消对此的注释并注释“using”,则示例将编译

typename q_t::t qwe;//这似乎是一个GCC4.7错误

编译代码,它使用GCC4.8.1工作

因此,正如规范所述:

using q_t = Q<T>;
// is equivalent to this 
typedef Q<T> q_t;
使用q_t=q;
//相当于这个
类型定义Q_t;

使用--std=c++11为我编译了适合我的g++4.8.1版本

它可以很好地使用。看起来像是4.7版本中的一个bug