要包含条件数据成员,我使用专用模板而不是名称空间,然后在每个专用中重载赋值运算符。发生的情况是在编译期间,无法识别专业化的成员变量。我不明白为什么,也无法在互联网上找到任何东西。
enum Def : int {A, B};
template<Def T>
struct X {};
// Forward declaration does not help, like it would in non-template implementations.
/*
* template<>
* struct X<B>;
*/
template<>
struct X<A>
{
int a;
int b;
X<A> & operator = (const X<B> & obj)
{
a = obj.a;
b = obj.b;
}
}
template<>
struct X<B>
{
int a;
int b;
int c;
int d;
X<B> & operator = (const X<A> & obj)
{
a = obj.a;
b = obj.b;
}
}
现在发生的是,在编译时,我得到一个错误,即X<B>
没有名为a
和b
的成员。这里有什么问题?
答案 0 :(得分:2)
问题是,当在专业化X<B>
的定义中实例化X<A>
时(X<A>::operator =
的定义要求),专业化{{1 }}尚不可见。这意味着它将是来自主模板的implicitly instantiated,后者没有成员X<B>
和a
。
您可以将b
的定义移出专门化X<A>::operator =
的定义之外,也可以移出X<A>
专门化的定义之后。例如
X<B>