2016-07-15 5 views
0

代わりのC++ 11には、typedefの対使用して、

typedef struct 
{ 
double x,y; 
} Point; 

C++ 11残念ながら、このアプローチは型T

template <typename T> 
using Point = struct {T x, y;}; 
のために動作しません

using Point = struct {double x, y;}; 

をサポートするテンプレート化

問題を解決する方法はありますか?

+7

しかし、なぜ...どうしてもやりたいのですか?あなたの元の 'typedef'でも無意味です(その名前をつけて少し皮肉です)。 –

答えて

4

using Point = ...;は(正式には単に '別名' と呼ばれる)タイプの別名です。つまり、関連するタイプの名前が...typedefの構文とは異なります。

template<typename T> using Point = ...;は、関係タイプが再び...で命名されたエイリアステンプレート、です。

エイリアステンプレートとエイリアステンプレートの共通点は、両方ともタイプID(C++ 11 [basic.scope.pdecl] p3)を参照する必要があるということです。タイプIDは、タイプのという名前にする必要があります。 問題はtemplate<typename T> struct {T x, y;}はタイプではなく、クラステンプレートであり、ちょうど確立されたエイリアステンプレートは型を参照する必要があるということです。 、What is the XY problem?

+0

@ ildjarn:説明をありがとう。 – justik

3

この場合、タイプエイリアスを使用する理由はありますか? structキーワードを前に置かないようにするには、C++ではそうではありません。

struct Point { double x, y; };を直接定義するだけです。テンプレートの場合と同じ

template <typename T> 
struct Point { T x, y; }; 
0

を参照してください、私はややにおける言語lawyeringに同意できないことについて] - ;あなたはそれが何であるか言っていないようあなた問題を解決するようにコードを変更することにしたように、私は...さっぱりだが他の答え、私は自分自身を書くことに決めました。

要するに、同じ理由でtemplate <typename T> struct {T x, y;};を使用できないため、 template <typename T> using Point = struct {T x, y;};を使用することはできません。

エイリアステンプレートはまだテンプレートです。標準では明示的に述べていませんが、テンプレートには名前が必要です([temp]/4-テンプレート名にはリンクがあります...を参照)。あなたは提供しません。

だから、名前を付けずに「問題を解決する」ことはできません。しかし、次のようなエイリアス宣言で名前を投げることもできません:template <typename T> using Point = struct P {T x, y;};。標準では明示的に禁止しています([dcl.typedef]/2-defined-type-idのdefine-type-specifier-seqはクラスまたは列挙型を定義しません))あなたが行うことができます

唯一のことは、このようなものになります。もちろん、あなたのPointは、いくつかのテンプレート引数をとり、しない限り、あなたが見ることができるよう、

template <typename T> 
struct Point {T x, y;}; 
template <typename T> 
using PointAlias = Point<T>; 

を、(無意味であり、この場合では、あなた素晴らしい別名テンプレートを作ることができます)。

したがって、単純なtemplate <typename T> struct Point {T x, y;};と貼り付けてください。あなたの "提案された"構文とまったく同じことをします。

関連する問題