VS2017 15.1无法编译以下代码:

template<int data_size>
struct Data { };

template<int s>
struct Base
{
    static constexpr int size() { return s; }
};

template<int s>
struct Derived : Base<s>   // struct Derived
{
    Data<Base<s>::size()> data;
};

int main()
{
    Derived<1> c;
}

错误是:



如果我不从Derived导出Base,则错误消失。使用gcc 5.4.0和clang 4.0.0两种情况都可以。

这段代码有什么问题吗?

最佳答案

由于大小是静态的,因此没有真正的理由要继承自Base。以下代码正在工作

template<int data_size>
struct Data
{

};

template<int s>
struct Base
{
    static constexpr int size()  { return s; }
};

template<int s>
struct Derived
{
    Data<Base<s>::size()> data;
};
int main()
{
    Derived<1> c;
}

如果仍然需要从base继承,则可以执行以下操作
template<int data_size>
struct Data
{

};

template<int s>
struct Base
{
    static constexpr int size()  { return s; }
};

template<int s,int s1>
struct _Derived : Base<s>   // struct Derived
{
    Data<Base<s1>::size()> data;
};


template <int s>
using Derived = _Derived<s,s>;

int main()
{
    Derived<1> c;
}

我不确定100%为什么VS不允许在继承和静态函数访问中使用相同的模板arg。以上是我需要的把戏:)

关于c++ - VS2017中没有编译时常量表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44099269/

10-09 22:48