2

テンプレートパラメータを使用してグローバル変数の子要素を参照しようとしています-グローバルでは機能しますが、グローバルの子では機能しません-コンパイル時に子の位置解決ができないのはなぜですか?

typedef unsigned char byte_t;
typedef unsigned short word_t;

struct byte_reg_t
{
     byte_t low;
     byte_t high;
};

union word_reg_t
{
     word_t value;
     byte_reg_t part;
};

word_t rax;
byte_t rah;
word_reg_t r16;
byte_reg_t r8;

template<typename ValueType, ValueType& Ref>
ValueType ret_ref()
{
     return Ref;
}

int main()
{
    word_t x = ret_ref<word_t,rax>();
    byte_t h = ret_ref<byte_t,rah>();
    //word_t sx = ret_ref<word_t,r16.value>(); // compile error
    //byte_t sh = ret_ref<byte_t,r16.part.low>(); // compile error
    //byte_t sh2 = ret_ref<byte_t,r8.low>(); // compile error

    return 0;
} 

VS2010およびclang3.1コンパイラは、//コンパイルエラー行を許可しません

コンパイラの動作の技術的な理由がわからないため、明確な説明についてはthx

4

1 に答える 1

1

その答えはC++標準にあります。古くなって申し訳ありませんが、私のバージョン(ISO / IEC 14882、第2版2003)には次のように書かれています(246ページ)。

§14.3.2テンプレートの非型引数

   [..]

3 [注:配列要素のアドレスおよび非静的クラスメンバーの名前またはアドレスは、テンプレート引数として受け入れられません。[..]]

于 2012-06-27T09:05:22.370 に答える