繁体   English   中英

使用typename使用模板转发类声明

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM