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;
};

它失败了,因为编译器看到的是some_trait<int>.

解决这个问题的最佳方法是什么?

4

7 回答 7

7

我认为能够专注于名称type1type2您必须使它们实际上是不同的类型,而不是同一类型的别名:

struct type1 {
     int data;
};

struct type2 {
    int data;
};

// ...

但是,如果您更多地解释您的最终目标,那么可能会有一种不同/更好的方式来完成您正在寻找的东西。

于 2010-08-05T16:33:25.697 回答
3

最好的方法到底是什么?

两个类型名都指同一个int类型。由于这里只有一种类型,因此您只需要一种特征。因此,“解决此问题的最佳方法”是删除第二个专业化并忘记它。完毕。

那是你想要的吗?如果不是,请提供更有意义的描述来说明您要实现的目标。

于 2010-08-05T16:30:16.133 回答
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;

我还从boost 库中看到了一些可以做你想做的事情,typedef 相同类型到不同类型的显式专业化,但我不记得它到底是什么。

于 2010-08-05T17:50:01.833 回答
3

该代码失败是因为编译器发现相同的特化发生了两次

你的问题是typedef,尽管它的名字,并没有定义一个新的类型。它只为另一种类型生成别名type1并且实际上只是同一类型的不同名称type2int

解决此问题的最佳方法是什么取决于您想要实现的目标。如果您绝对需要这种专业化,则必须提出两种不同的类型。但是,可能有更好的方法来做到这一点。

于 2010-08-05T19:04:48.893 回答
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 回答