对于这个非常模糊的标题感到抱歉,这很难形容。
我坚持的错误就是这个,我不知道这意味着什么:
carray.h:176:错误:'typename Carray< T,Allocator> :: is_iterator'名称'模板< class T,class Allocator>模板< class I,bool check> struct Carray< T,Allocator> :: is_iterator',它不是一个类型
我有这个片段来检测某些东西是否是迭代器并使用正确的重载(http://stackoverflow.com/questions/6050441/why-does-this-constructor-overload-resolve-incorrectly)。这编译:
template<class T> class Carray {
private:
// uses SFINAE to determine if the passed in type is indeed an iterator
template<class It>
class is_iterator_impl {
private:
typedef char yes[1];
typedef char no[2];
template<class C>
static yes& _test(typename C::iterator_category*);
template<class>
static no& _test(...);
public:
static const bool value = sizeof(_test<It>(0)) == sizeof(yes);
};
template<class It, bool check = is_iterator_impl<It>::value> struct is_iterator { typedef void type; };
template<class It> struct is_iterator<It*, false> { typedef void type; };
template<class It> struct is_iterator<It, false> { };
public:
template<class It>
Carray(It first, It last, typename is_iterator<It>::type *dummy = 0) {
// create array from 2 iterators
}
};
现在我想将实现与声明分开,我尝试了这个,但是我收到了错误:
template<class T> class Carray {
private:
// uses SFINAE to determine if the passed in type is indeed an iterator
template<class It> class is_iterator_impl;
template<class It, bool check = is_iterator_impl<It>::value> struct is_iterator { typedef void type; };
template<class It> struct is_iterator<It*, false> { typedef void type; };
template<class It> struct is_iterator<It, false> { };
public:
template<class It> Carray(It first, It last, typename is_iterator<It>::type *dummy = 0);
};
template<class T>
template<class It>
Carray<T>::Carray(It first, It last, typename Carray<T>::is_iterator<It>::type *dummy) {
// create array from 2 iterators - ERROR IN THIS DEFINITION
}
template<class T>
template<class It>
class Carray<T>::is_iterator_impl {
private:
typedef char yes[1];
typedef char no[2];
template<class C>
static yes& _test(typename C::iterator_category*);
template<class>
static no& _test(...);
public:
static const bool value = sizeof(_test<It>(0)) == sizeof(yes);
};
我正在使用g ++ 4.5.5。
答案 0 :(得分:3)
这些类型的问题在某种程度上是模糊(即,有相当多的代码,并且在第一遍中读取并不简单)你应该提供一个工作(或者说是失败的例子)。
我的猜测是你错过了template
关键字(Carray
构造函数参数):
typename Carray<T, Allocator>::template is_iterator<InputIterator>::type
// ^^^^^^^^
答案 1 :(得分:-2)
查看每行末尾的分号,看起来你写的是这样的:
template<class T, class Allocator>
template<class I, bool check> struct Carray<T, Allocator>::is_iterator
在第一行末尾没有分号,只是一个猜测。