C++ 使用C++;17
我试图用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
错误:应在“…”标记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...;
};