C++ Typedefs和模板专门化

C++ Typedefs和模板专门化,c++,templates,typedef,type-systems,template-specialization,C++,Templates,Typedef,Type Systems,Template Specialization,考虑以下代码: 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

考虑以下代码:

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;
};
typedef int type1;
typedef int type2;
模板
建构某些特质;
模板
构造一些特征
{
静态常数int某物=1;
};
模板
构造一些特征
{
静态常数int某物=2;
};
它失败了,因为编译器看到的是
some\u trait
的两个专门化


最好的办法是什么?

最好的办法是什么

两个类型名都引用相同的
int
类型。因为这里只有一种类型,所以你只需要一种特性。所以,“最好的解决办法”是删除第二个专门化,然后忘掉它。完成了


这就是你想要的吗?如果没有,请提供一个更有意义的描述,说明您正在努力实现的目标。

我认为要专门研究名称
type1
type2
,您必须使它们实际上是不同的类型,而不是同一类型的别名:

struct type1 {
     int data;
};

struct type2 {
    int data;
};

// ...

但是,如果你对你的最终目标做更多的解释,可能会有一种不同的/更好的方式来实现你想要的目标。

我看不出你在这里想做什么。最后,两者都是
某种特质


尝试围绕单个int创建结构?

如果您的意思是显式专门化,则可以使用类似的结构:

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;
enum-TypeOne;
枚举类型2;
模板
类AClass;
模板
类AClass{
公众:
智力的东西;
};
模板
类AClass{
公众:
烧焦某物;
};
AClass obj1;
AClass obj2;

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

听起来像下面这样的东西可能就是你想要的:

template <int arg>
class AClass
{
    static const int something=arg;
};
模板
类AClass
{
静态常量int something=arg;
};
将其实例化为:

AClass<1> obj1;
AClass<2> obj2;
AClass obj1;
AClass obj2;

该代码失败,因为编译器看到相同的专门化发生了两次

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


什么是最好的解决方法取决于你想要实现什么。如果你绝对需要这种专门化,你将不得不想出两种不同的类型。然而,可能有更好的方法来做到这一点

我认为您希望实现如下目标:
模板结构typeify{static const T something=T;}您的2个专门化将被写为
struct int_1:typeify{}

我相信他想专门研究type1和type2,这是因为他认为它们都是不相关的类型,但是编译器在不相关的实现细节上遇到了麻烦,它们都是int。你如何期望找到解决这个问题的最佳方法?当您还没有定义您的问题时?这是一个常见的错误:询问失败的方法,而不是询问实际问题。你想解决什么问题?是什么让你想在
type1
type2
中添加特征?为什么需要两个
int
s才能不同?--找到答案的最大一步是提出正确的问题。我可以想象和举例说明,
type1
index\u类型
type2
order\u类型
这两种类型可能是
int的
,但需要不同的专门化,以便对索引进行转换。我看到的独特解决方案是制作不同的类型,但有时会很痛苦。