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

时间:2013-09-06 12:34:03

标签: 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' 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;
}

ISO 14882(C ++ 11)说这两个声明必须具有相同的语义(第145页)。

但是,如果我们使用'using'声明了q_t,那么示例不会使用GCC 4.7.2(Debian Wheezy)和GCC 4.7.3(Ubuntu 13.04)进行编译,但是使用'typedef'语句替换'using'语句会使它汇编了。

这是GCC中的错误还是我们误解了标准?

2 个答案:

答案 0 :(得分:4)

这似乎是一个GCC 4.7错误。

Here is my test编译代码,使用gcc 4.8.1

正如规范所说:

using q_t = Q<T>;
// is equivalent to this 
typedef Q<T> q_t;

答案 1 :(得分:1)

使用--std = c ++ 11

为g ++ 4.8.1编译好