【发布时间】:2015-10-08 14:15:42
【问题描述】:
我有下一个代码可以在 Visual Studio 2015 上正常编译:
class Base
{
protected:
constexpr Base(float value);
private:
float _value;
};
constexpr Base::Base(float value)
: _value(value)
{
}
class Derived : public Base
{
public:
constexpr Derived(float value)
: Base(value)
{
}
};
通过将其更改为:
template<typename T>
class Base
{
protected:
constexpr Base(T value);
private:
T _value;
};
template<typename T>
constexpr Base<T>::Base(T value)
: _value(value)
{
}
class Derived : public Base<float>
{
public:
constexpr Derived(float value)
: Base(value)
{
}
};
我收到以下错误:
错误 C2134: 'Base::Base': 调用不会产生常量表达式
注意:失败是由于调用了未定义的函数或未声明的 'constexpr'
注意:参见'Base::Base'的声明
通过在类中实现Base的构造函数,错误神奇地消失了:
template<typename T>
class Base
{
protected:
constexpr Base(T value)
: _value(value)
{
}
private:
T _value;
};
class Derived : public Base<float>
{
public:
constexpr Derived(float value)
: Base(value)
{
}
};
这是编译器中的错误还是我在第二种情况下做错了什么?
编辑:所有 3 个版本都可以使用 clang 和 gcc 编译
【问题讨论】:
标签: c++ c++11 visual-studio-2015