我通常声明我的类和模板,然后定义它们的方法(当然是在同一个头文件中)。我只是觉得这样更容易阅读。好吧,我遇到了一个案例,我无法确定在类外定义中使用的工作类型签名。这是我正在做的一个简化示例,它说明了问题:
template <class T>
struct Foo
{
Foo(T a, T b);
template
< class Iterator
, enable_if< is_iterator<Iterator> >
>
Foo
( Iterator first
, Iterator last
);
};
template <class T>
Foo<T>::Foo(T a, T b)
{ ... }
template <class T>
template
< class U
, WHAT_GOES_HERE?
>
Foo<T>::Foo(U f, U l)
{ ... }
我在WHAT_GOES_HERE
插槽中尝试了很多方法来尝试获得匹配的签名,但我一直失败。我需要 enable_if 来区分一个传入两个 T 类型对象的情况,以及一个传入一对迭代器的情况。如果模板化的构造函数是在主模板中定义的,则代码可以正常工作,这就是代码当前的工作方式,但我更愿意将定义移到声明之外。
编辑:我应该提一下,我不能只在定义中重复使用 enable_if<...> ,因为 enable_if<...> 为其类型分配了一个默认值,而你不能在不是的定义中做到这一点也是一个宣言。