4

本日、紛らわしい 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) では、これら 2 つの宣言は同じ意味を持つ必要があると規定されています (145 ページ)。

ただし、「using」で宣言された q_t がある場合、例は GCC 4.7.2 (Debian Wheezy) および GCC 4.7.3 (Ubuntu 13.04) を使用してコンパイルされませんが、「using」ステートメントを「typedef」ステートメントに置き換えるとコンパイルされます。

GCC のバグですか、それとも標準を誤解しているだけですか?

4

2 に答える 2

4

これは GCC 4.7 のバグのようです。

ここにコードをコンパイルするための私のテストがあり、 gcc 4.8.1 を使用して動作します

したがって、仕様には次のように記載されています。

using q_t = Q<T>;
// is equivalent to this 
typedef Q<T> q_t;
于 2013-09-06T12:42:56.437 に答える
1

--std=c++11 を使用して g++ 4.8.1 で問題なくコンパイルできます

于 2013-09-06T12:49:36.190 に答える