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

标签 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”语句会使它编译。<​​/p>

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

最佳答案

这似乎是 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;

关于C++ 使用别名访问嵌套类型(使用 vs typedef),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18658007/

相关文章:

c++ - 如何为ns2.35添加反义协议(protocol)?

c - 在Solaris9机器上生成文件错误: Dont know how to make target

特定值的 C++ 模板特化

c++ - 是否可以在 bool 中发送十进制值(8 位)?如果是那么如何?

c++ - 模板化类声明 C++

c++ - 使用带有 wxEvtHandler::Bind 的模板自定义 wxEvent

意外结果的 C++ 闭包

c - __STDC_IEC_559__ 与现代 C 编译器的状态

C - Makefile 在头文件更改后编译,但更改不生效

c++ - 在 C++11 中如何使用 std::async with std::launch::any