over 3 years ago

複習一下為什麼需要 typename 這個關鍵字,這篇解答說的不錯,翻譯一下
原文:Why is the keyword “typename” needed before qualified dependent names, and not before qualified independent names?

C++ 的變數名稱可以屬於三種不同級別的 entities: 值(Values), 型別(types), 和樣板(templates)

struct Foo
{
    typedef int A;
    static double B;
    template <typename T> struct C;
};

上面這個例子的三個變數
Fooo::A 是型別
Foo::B 是值,而
Foo::C 則是樣板

在上面的例子中 Foo 是一個完全型別 (complete type)(註:沒有加上 template 的型別),所以 compiler 已經知道 Foo::A 這些東西所指為何。但若想像有個不完全型別的 struct 長得像以下這樣:

template <typename T> struct Bar
{
    T::A x;
};

這時候我們就遇到問題了:什麼是 T::A
如果 T = Foo 那麼 T::A 是個 int 也就是個型別,一切相安無事:
但是當 T = struct { char A; };T::A 就是一個值,這一條敘述就沒有任何意義。

因此 compiler 要求你告訴它 T::AT::BT::C 應該要是什麼。如果你什麼都不說,預設就是 value。如果你加了 typename,它就被解讀為 typename,你說他是 template 它就是 template。

template <typename T> struct Bar
{
    typename T::A x;    // 很好,就令它是個 typename 吧

    void foo()
    {
        int a = T::B;   // 假設它是 value, OK

        T::template C<int> z;  // 令他是 template
        z.gobble(a * x);
    }
};

再來才會確認 T::B 是否可以轉型成 intax 可否被相乘,以及 C<int> 是否真的有一個成員。
function gobble 會被留到你真的建立了 template 的 instance 之後才檢查。
但一個變數名稱該表示為 value、type 或 template 的規定,對於程式語法的正確性是很基本而且一定要在 template 定義時提供的。

← 去讀貓園跟貓喝個下午茶 選擇性掛載 proxy 的瀏覽器套件 →
 
comments powered by Disqus