1

楽しみのために template-template を試しています。私は次のクラスを持っています:

template<template<class> class T, typename R> class Unit
{    
    using FullType = T<R>;
    using Ratio = R;
    //using Type = T;

    ...
};

タイプ とをメンバー型Rおよびとして定義しました。としてエイリアスすることは可能ですか?T<R>RatioFullTypeTType

上記のコメント行により、g++ 4.7 で次のエラーが発生します。

expected nested-name-specifier before 'Type'
using-declaration for non-member at class scope
expected ';' before '=' token
expected unqualified-id before '=' token

多かれ少なかれランダムな構文をいくつか試しましたが、コンパイルされたものはありませんでした。

ありがとう !

4

2 に答える 2

4

は型ではないのでT、尋ねられた質問は意味がありません。ただし、次のようにエイリアスを作成できますT

template <template <typename> class T, typename R> class Unit
{
    template <typename U> using MyTemplate = T<U>;
    // ...

    // use e.g. MyTemplate<int> to get T<int>
};

C++ 11より前は、私のこの回答で概説されているように、より表記法に関連するものが必要になります(たとえば、標準アロケーターのrebindメカニックによって標準ライブラリで使用されます)。

于 2012-12-15T21:48:26.273 に答える
3

のエイリアスを作成することはできませんT。以下は、エイリアスを作成するために委員会で議論されました(非常に遅い C++11 ドラフトには、欠陥レポートがクリーンアップされたエイリアスであるTと述べたメモが含まれていたため)。T

// Courtesy of @KerrekSB
template <template <typename> class T, typename R> class Unit
{
    template <typename U> using MyTemplate = T<U>;
    // ...

    // use e.g. MyTemplate<int> to get T<int>
};

MyTemplate<int>whileは と同じ型ですが、 とは同じT<int>MyTemplateないことに注意してくださいThttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1286の文言はそれを変更することになっていましたが、前回の会議では、それは非常に特別な機構であると考えられていました。エイリアス テンプレート (独自のテンプレート) であることが判明したものに実際には適合せず、レビューに差し戻されました。その効果を得るためにusing MyTemplate = T;、将来的には法案に適合する可能性があります(もちろん、提案されて受け入れられた場合)。

于 2012-12-16T13:25:38.237 に答える