如何声明一个自引用的模板类型定义



这里有一个小例子,它与我要做的基本相似:

#include <boost/variant/variant.hpp>
#include <boost/variant/recursive_wrapper.hpp>
#include <utility>
#include <vector>
struct foo {
    const char * str;
};
typedef std::pair<float, float> fpair;
//typedef std::vector<boost::variant<int, fpair, foo, vlist>> vlist;
// ^ No...
//typedef std::vector<boost::variant<int, fpair, foo, boost::recursive_wrapper<vlist>>> vlist;
// ^ No...
//template <typename T = vlist<T> >
//using vlist = std::vector<boost::variant<int, fpair, foo, boost::recursive_wrapper<vlist>>>;
// ^ No...
template <typename T = vlist<T> >
using vlist = std::vector<boost::variant<int, fpair, foo, boost::recursive_wrapper<T>>>;
// Still no?
int main () {
    std::cout << "Hello worldn";
}

gcc 4.8的错误是:

test.cpp:12:33: error: expected nested-name-specifier before ‘vlist’
template <typename T = typename vlist<T>>
                                ^
test.cpp:12:33: error: expected ‘>’ before ‘vlist’

clang 3.6的错误是:

test.cpp:12:24: error: unknown type name 'vlist'
template <typename T = vlist<T>>
                       ^
test.cpp:12:29: error: expected ',' or '>' in template-parameter-list
template <typename T = vlist<T>>
                            ^
test.cpp:12:32: error: expected unqualified-id
template <typename T = vlist<T>>
                               ^
3 errors generated.

(编辑:实际上这些错误来自上述代码的略有不同的版本,但它们都给出了相当相似的消息)

我之前看了这些略有不同的问题,我仍然被难住了:

如何声明自引用模板类型

如何正确声明一个自引用模板类型?

Boost Fusion适应模板化自引用结构的声明

有没有人知道这个技巧,或者有一些原因我不知道编译器本质上不能做到这一点?

我相信你只是想要boost::make_recursive_variant:

#include <boost/variant/variant.hpp>
#include <boost/variant/recursive_variant.hpp>
#include <utility>
#include <vector>
struct foo {
    const char* str;
};
typedef std::pair<float, float> fpair;
typedef boost::make_recursive_variant<
    int,
    fpair,
    foo,
    std::vector<boost::recursive_variant_>
>::type vlist;
int main() {
    std::vector<vlist> vec;
    vec.push_back(4);
    vec.push_back(fpair{1.0f, 2.0f});
    vlist v2(vec);
}

最新更新