Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C++;17_C++_Templates_C++17_Template Meta Programming - Fatal编程技术网

C++ 使用C++;17

C++ 使用C++;17,c++,templates,c++17,template-meta-programming,C++,Templates,C++17,Template Meta Programming,我试图用C++17中的包扩展来了解一些新的可能性,但遇到了一个我不理解的问题。 我创建了一个派生类,它继承自一组基类模板 然后,我尝试将所有基类构造函数导入到中,并添加一个访问基类常量的方法。 然而,当我试图编译时,我得到了以下错误 错误:应在“…”标记23之前使用主表达式 返回mValue==Base::value 如果我对基类构造函数的导入进行注释,或者对方法进行注释,编译工作就会发现。 有什么东西阻止我两者兼得吗 下面是一个简单的例子: #include <tuple> #i

我试图用C++17中的包扩展来了解一些新的可能性,但遇到了一个我不理解的问题。 我创建了一个派生类,它继承自一组基类模板

然后,我尝试将所有基类构造函数导入到中,并添加一个访问基类常量的方法。 然而,当我试图编译时,我得到了以下错误

错误:应在“…”标记23之前使用主表达式
返回mValue==Base::value
如果我对基类构造函数的导入进行注释,或者对方法进行注释,编译工作就会发现。 有什么东西阻止我两者兼得吗

下面是一个简单的例子:

#include <tuple>
#include <utility>
using namespace std;

template <size_t N, typename... Types>
struct Base
{
    static constexpr size_t value = N;
};

template <typename Tuple, typename Indices>
struct Derived;

template <typename Tuple, size_t... Is>
struct Derived<Tuple, index_sequence<Is...>> : public Base<Is, std::tuple_element_t<Is,Tuple>... >...
{   
    // Works if following line is commented
    using Base<Is, tuple_element_t<Is, Tuple>...>::Base...;

    template<size_t M> bool check() const
    {
      return mValue == Base<M, tuple_element_t<Is, Tuple>...>::value;
    }

    size_t mValue;
};

template <typename... Types>
struct Test : public Derived<tuple<Types...>, make_index_sequence<sizeof...(Types)>>
{};

int main ()
{
    using MyType = Test<int, float, float>;
    MyType test;

    return 0;
}
#包括
#包括
使用名称空间std;
模板
结构基
{
静态constexpr size\u t值=N;
};
模板
结构派生;
模板
结构派生:公共基。。。
{   
//如果对以下行进行注释,则此选项有效
使用Base::Base。。。;
模板布尔检查()常量
{
返回mValue==Base::value;
}
大小值;
};
模板
结构测试:公共派生
{};
int main()
{
使用MyType=测试;
MyType试验;
返回0;
}
这是一个。该计划结构良好,clang和icc接受它

msvc接受gcc错误报告中的简单版本,但拒绝接受稍微复杂一点的版本(与您的示例更相似):

模板
类U{};
模板
结构X:U。。。
{
使用U::U。。。;
}; 
这是一个。该计划结构良好,clang和icc接受它

msvc接受gcc错误报告中的简单版本,但拒绝接受稍微复杂一点的版本(与您的示例更相似):

模板
类U{};
模板
结构X:U。。。
{
使用U::U。。。;
}; 

非常感谢。我以为我疯了。在发布之前,我用最新版本的wandbox进行了检查,但再次选择了gcc。@是的,做我们在这项功能之前做的事情-有一个线性继承链,每次一个。非常感谢。我以为我疯了。在发布之前,我用最新版本的wandbox进行了检查,但再次选择了gcc。@the_summer是的,做我们在这个功能之前做过的事情-拥有一个线性继承链,并一次一个地将每个继承链都带进来。
#include <tuple>
#include <utility>
using namespace std;

template <size_t N, typename... Types>
struct Base
{
    static constexpr size_t value = N;
};

template <typename Tuple, typename Indices>
struct Derived;

template <typename Tuple, size_t... Is>
struct Derived<Tuple, index_sequence<Is...>> : public Base<Is, std::tuple_element_t<Is,Tuple>... >...
{   
    // Works if following line is commented
    using Base<Is, tuple_element_t<Is, Tuple>...>::Base...;

    template<size_t M> bool check() const
    {
      return mValue == Base<M, tuple_element_t<Is, Tuple>...>::value;
    }

    size_t mValue;
};

template <typename... Types>
struct Test : public Derived<tuple<Types...>, make_index_sequence<sizeof...(Types)>>
{};

int main ()
{
    using MyType = Test<int, float, float>;
    MyType test;

    return 0;
}
template <typename>
class U { };

template <class... Args>
struct X : U<Args>... 
{
    using U<Args>::U...;
};