2008-10-07

人間コンパイラの道はまだまだはてしなく遠い

ふと気がつくと、TR1のrefの実装がill-formedだった。やれやれ、Two Phase Lookupをまともにサポートしていないコンパイラを常用すべきではないのかもしれない。以下のコードはコンパイルエラーになるべき。

template < typename T >
struct base
{
    typedef T type ;
} ;

template < typename T >
struct derived : public base< T >
{
    typedef type result ;// ill-formed.
} ;

derivedクラスで使われているtypeは、Non-dependant nameなので、first phaseで名前解決されるべきである。然るに、typeという名前は見つからないのでコンパイルエラーになる。解決方法は、Dependant Nameにするしかない。

typedef typename base::type result ;
typedef typename derived::type result ;

まあそもそも、あのrefの実装は愚直すぎるのだけれど。関数呼び出し演算子のオーバーロードは、単純にreference_wrapperの中で、可能ならばVariadic Templatesを使って、実装しておけばいい。

No comments:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.