是否可以将方法定义移到声明之外?
template <typename T1>
class A
{
template <bool T2>
class B;
template<>
class B<true>
{
void f() { /* Do smg */ }
}
class B<false>
{
void f() { /* Do smg else */ }
}
}
如果我尝试在类声明外定义f(),就像这样
template <typename T1>
template <>
void A<T1>::B<true>::f() { /* Do smg */ }
编译器提供错误 C3855:模板参数T2与声明不兼容。
答案 0 :(得分:1)
您无法从[temp.expl.spec]明确专门化非专业类模板的类成员模板:
在显示的类模板成员或成员模板的显式特化声明中 在命名空间作用域中,可以保留成员模板及其一些封闭的类模板 unspecialized,除非声明在封闭时不明确地专门化类成员模板 类模板也没有明确专门化。
即使B
定义中明确的A
特征也是不正确的。如果你需要做这样的事情,我就不会使用B
的成员类模板。
答案 1 :(得分:0)
我找到了破解系统的方法。使用部分特化而不是显式特化,使用伪模板参数,如下所示:http://goo.gl/yHRQwV
template <typename T1>
class A
{
public:
template <bool T2, typename = void>
class B;
template <typename Dummy>
class B<true, Dummy>
{
public:
void f1();
};
template <typename Dummy>
class B<false, Dummy>
{
public:
void f1();
};
};
template <typename T1>
template <typename Dummy>
void A<T1>::B<true, Dummy>::f1()
{
}
template <typename T1>
template <typename Dummy>
void A<T1>::B<false, Dummy>::f1()
{
}
int main()
{
A<int>::B<true> b1;
b1.f1();
A<int>::B<false> b2;
b2.f1();
}
不确定这是否合法,但确实有效。
实际上,它并没有解决我的问题。在这种情况下,我不能将一般方法f2(),f3()等添加到B类而不需要专门化:http://goo.gl/wtIY0e
template <typename T1>
class A
{
public:
template <bool T2, typename = void>
class B
{
public:
void f2();
void f3();
};
template <typename Dummy>
class B<true, Dummy>
{
public:
void f1();
};
template <typename Dummy>
class B<false, Dummy>
{
public:
void f1();
};
};
template <typename T1>
template <typename Dummy>
void A<T1>::B<true, Dummy>::f1()
{
}
template <typename T1>
template <typename Dummy>
void A<T1>::B<false, Dummy>::f1()
{
}
template <typename T1>
template <bool T2, typename Dummy>
void A<T1>::B<T2, Dummy>::f2()
{
}
template <typename T1>
template <bool T2, typename Dummy>
void A<T1>::B<T2, Dummy>::f3()
{
}
int main()
{
A<int>::B<true> b1;
b1.f1();
b1.f2(); // error: A<int>::B<true> has no member f2
b1.f3(); // error: A<int>::B<true> has no member f3
A<int>::B<false> b2;
b2.f1();
b2.f2(); // error: A<int>::B<false> has no member f2
b2.f3(); // error: A<int>::B<false> has no member f3
}
最后,我找到了一个寻找一整天的解决方案:静态多态 http://goo.gl/7yGZxM
template <typename T1>
struct A
{
template<typename T2>
struct BaseB
{
void f1();
void f2();
void f3();
};
struct B_true : BaseB<B_true>
{
void f1_impl();
};
struct B_false : BaseB<B_false>
{
void f1_impl();
};
};
template <typename T1>
template<typename T2>
void A<T1>::BaseB<T2>::f1()
{
static_cast<T2*>(this)->f1_impl();
}
template <typename T1>
template<typename T2>
void A<T1>::BaseB<T2>::f2()
{
}
template <typename T1>
template<typename T2>
void A<T1>::BaseB<T2>::f3()
{
}
template <typename T1>
void A<T1>::B_true::f1_impl()
{
}
template <typename T1>
void A<T1>::B_false::f1_impl()
{
}
int main()
{
A<char>::B_true b_true;
b_true.f1();
b_true.f2();
b_true.f3();
A<char>::B_false b_false;
b_false.f1();
b_false.f2();
b_false.f3();
}