首页 > 解决方案 > 如何转发声明依赖于变体定义的类,而后者又依赖于模板类?

问题描述

我有一个名为Foo. 我还有一个名为Fum. Fum<Foo>包含类型的数据成员Foo。此外,我有一个变体定义typedef std::variant< Fum<Foo> /* etc.*/ > var_t;Foo包含类型的数据成员var_t

如您所见,var_t取决于FumFoo,并且Foo取决于var_t。我可以执行哪些声明序列来编译以下代码:

阅读错误评论

尝试1:

#include <iostream>
#include <variant>   

// Forward Decls
template <typename T>
class Fum;

class Foo;


typedef std::variant< Fum<Foo> /* etc.*/ > var_t;

template<typename T>
class Fum {

private:

    // Error: Incomplete type Foo.

    T value;

public:
    /*
    +++++ Construct T object emplace +++++
    */
    template<typename ... Params>

    Fum<T>(Params&& ... argsOfT)

        :value(std::forward<Params>(argsOfT)...)

    {}

    Fum<T>(Fum<T>&& fumObj)
        :value(std::move(fumObj.value))
    {}

}; // Fum



class Foo {

private:

    var_t val;


public:


    Foo(var_t&& valParam)

        :val(std::move(valParam))

    {}

}; // Foo

尝试2:

#include <iostream>
#include <variant> 

// Forward Decls
template <typename T>
class Fum; // note: template is declared here
class Foo;


typedef std::variant< Fum<Foo> /* etc.*/ > var_t;


class Foo {

private:

    var_t val;


public:


    Foo(var_t&& valParam)

        :val(std::move(valParam))

    {}

}; // Foo

template<typename T>
class Fum {

private:
    //  note: in instantiation of template class 
    // 'std::__1::variant<Fum<Foo> >' requested here
    T value;

public:
    /*
    +++++ Construct T object emplace +++++
    */
    template<typename ... Params>

    Fum<T>(Params&& ... argsOfT)

        :value(std::forward<Params>(argsOfT)...)

    {}

    Fum<T>(Fum<T>&& fumObj)
        :value(std::move(fumObj.value))
    {}

}; // Fum

标签: c++

解决方案


我不认为你可以。

变体的替代品必须都是完整的类型,并且您的Fum<T>商店 aT作为成员。

几个月前我遇到了类似的问题。我有一个这样的设计,其中一个替代方案是 a vector<T>,这很好,因为vector<T>即使T不是完整的……但我不相信你的情况Fum<T>是这样,当我开始时也不是这样尝试使用其他一些容器。

如果Fum改为存储一些指针,并动态分配它T,你会没事的。


推荐阅读