2

次のコードを検討してください。

typedef int type1;
typedef int type2;

template <typename>
struct some_trait;

template <>
struct some_trait<type1>
{
    static const int something=1;
};

template <>
struct some_trait<type2>
{
    static const int something=2;
};

コンパイラが認識するのは の 2 つの特殊化であるため、失敗しますsome_trait<int>

これを回避する最善の方法は何ですか?

4

7 に答える 7

7

名前を特化できるようにするには、同じタイプのエイリアスではなく、実際には異なるタイプにする必要がtype1ありtype2ます。

struct type1 {
     int data;
};

struct type2 {
    int data;
};

// ...

ただし、最終目標について詳しく説明すると、探しているものを達成するための別の/より良い方法があるかもしれません.

于 2010-08-05T16:33:25.697 に答える
3

正確に何を回避するための最良の方法?

両方のタイプ名は同じintタイプを参照します。ここにはタイプが1つしかないため、必要な特性は1つだけです。したがって、「これを回避する最善の方法」は、2番目の専門分野を削除してそれを忘れることです。終わり。

それはあなたが望んでいたことですか?そうでない場合は、達成しようとしていることについて、より意味のある説明を提供してください。

于 2010-08-05T16:30:16.133 に答える
3

コンパイラが同じ特殊化が2回発生していることを確認するため、このコードは失敗します。

あなたの問題はtypedef、その名前にもかかわらず、新しいタイプを定義しないということです。別のタイプのエイリアスのみを生成します。type1と実際にはtype2int同じタイプの異なる名前です。

これを回避する最善の方法は、何を達成したいかによって異なります。この専門分野がどうしても必要な場合は、2つの異なるタイプを考え出す必要があります。ただし、これを行うにはもっと良い方法があるかもしれません。

于 2010-08-05T19:04:48.893 に答える
3

明示的な特殊化を意味する場合は、次のようなものを使用できます。

enum TypeOne;
enum TypeTwo;

template <typename>
class AClass;

template <>
class AClass<TypeOne>{
 public:
  int something;
};

template <>
class AClass<TypeTwo>{
 public:
  char something;
};

AClass<TypeOne> obj1;
AClass<TypeTwo> obj2;

また、明示的な特殊化のために同じ型を異なる型に typedef する、ブーストライブラリから何かを見たことがありますが、それが正確に何であったかは覚えていません。

于 2010-08-05T17:50:01.833 に答える
2

次のようなものがあなたが求めているものかもしれません:

template <int arg>
class AClass
{
    static const int something=arg;
};

次のようにインスタンス化されます。

AClass<1> obj1;
AClass<2> obj2;
于 2010-08-05T18:17:54.667 に答える
0

ここで何をしようとしているのかわかりません。結局、両方です some_trait< int >
単一の int の周りに構造体を作成しようとしましたか?

于 2010-08-05T16:36:31.277 に答える
0

私はあなたがこのようなことを達成したいと思っていると思います:template <typename T, T t> struct typify{ static const T something = t;};あなたの2つの専門分野は次のように書かれstruct int_1 : typify<int, 1>{};ます...

于 2010-09-06T03:48:16.670 に答える