考虑以下代码:
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>
的两个特化。
最好的解决方法是什么?
答案 0 :(得分:7)
我认为能够专注于名称type1
和type2
,您必须使它们实际上是不同类型而不是相同类型的别名:
struct type1 {
int data;
};
struct type2 {
int data;
};
// ...
但如果你更多地了解你的最终目标,可能会有不同的/更好的方法来完成你正在寻找的目标。
答案 1 :(得分:3)
最好的方法是什么?
两个类型名称都指向相同的int
类型。由于此处只有一个类型,因此您只需要一个特征。因此,“解决这个问题的最佳方法”是删除第二个专业并忘掉它。完成。
这就是你想要的吗?如果没有,请提供更有意义的描述,说明您要实现的目标。
答案 2 :(得分: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库中看到了可以做你想要的东西,为不同的类型输入相同的类型以进行显式特化,但我不记得它究竟是什么。
答案 3 :(得分:2)
听起来像下面的内容可能是你所追求的:
template <int arg>
class AClass
{
static const int something=arg;
};
将被实例化为:
AClass<1> obj1;
AClass<2> obj2;
答案 4 :(得分:2)
该代码失败,因为编译器看到 发生 两次 的 相同的 专业化。
您的问题是typedef
,尽管名称如此, 不 定义新类型。它只为另一种类型生成 别名 。 type1
和type2
以及int
实际上只是同一类型的不同名称。
最好的方法取决于你想要达到的目标。如果你绝对需要这种专业化,你将不得不提出两种不同的类型。但是,可能有更好的方法来做到这一点。
答案 5 :(得分:0)
我不知道你在这里想做什么。最后,两者都是 some_trait< int >
尝试围绕单个int制作结构?
答案 6 :(得分:0)
我认为你想要实现这样的目标:template <typename T, T t> struct typify{ static const T something = t;};
你的2个专业将被写成struct int_1 : typify<int, 1>{};
和......