[英]Forward class declaration with template using typename
我有以下情况: -
template<typename Derived, typename ValType>
class foo
{
public:
template<typename R>
bar<typename std::vector<R>::const_iterator> select()
{
std::vector<R> translation;
return bar<typename std::vector<R>::const_iterator>(std::move(translation));
}
};
template<typename T>
class bar
: public foo<bar<T>, typename std::iterator_traits<T>::value_type>
{
public:
bar(std::vector<typename std::iterator_traits<T>::value_type>&& vec)
{
}
};
它基本上是一个小概念证明我正在使用CRTP与foo作为mixin。
问题是我相信我应该使用前瞻性声明,但我尝试了以下方法: -
class bar; // I didn't expect this to work
但我确实希望这可以工作: -
template<typename R>
class bar;
编译好,直到我实际调用select()
std::vector<int> enumerable_vector;
enumerable_vector.push_back(1);
enumerable_vector.push_back(2);
bar<typename std::vector<int>::const_iterator> baz(std::move(enumerable_vector));
baz.select<std::string>();
这会导致以下错误: -
错误错误C2027:使用未定义类型'foo :: bar'
任何帮助将不胜感激,谢谢!
错误错误C2027:使用未定义类型'foo :: bar'
错误消息似乎表明您在foo
转发声明的嵌套类型bar
。 您需要转发声明正确的类型(将bar
的声明移到命名空间级别,只是在foo
的定义上)
编辑:这个答案是不正确的。 定义 select
时, bar
不需要完成,当select
实例化时必须完成。 不需要在bar
的类说明符之后移动select
out-of-line的定义。
问题是你在foo
的类说明符中定义select
需要bar
完成。 如果转发声明bar
并仅在类说明符中声明 select
,则可以将select
out-of-line的定义移动到bar
完成的位置。 然后编译好 :
#include <iterator>
#include <utility>
#include <vector>
template<typename T> class bar;
template<typename Derived, typename ValType>
class foo
{
public:
template<typename R>
bar<typename std::vector<R>::const_iterator> select();
};
template<typename T>
class bar
: public foo<bar<T>, typename std::iterator_traits<T>::value_type>
{
public:
bar(std::vector<typename std::iterator_traits<T>::value_type>&& vec)
{
}
};
template<typename Derived, typename ValType>
template<typename R>
bar<typename std::vector<R>::const_iterator> foo<Derived, ValType>::select()
{
std::vector<R> translation;
return bar<typename std::vector<R>::const_iterator>(std::move(translation));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.