在模板定义中调用非静态constexpr成员函数

时间:2019-11-10 14:39:00

标签: c++ c++17

MySpinner

在(*)行的原始问题中,我错误地使用了current_selection,这显然是不正确的,因为#include <type_traits> template<size_t S> struct A { constexpr size_t size() const noexcept { return S; } // Not static on purpose! }; struct B : public A<123> {}; template <class T> typename std::enable_if<std::is_base_of_v<A<T().size()>, T>, bool>::type // (*) f(const T&, const T&) noexcept { return true; } int main() { B b1, b2; f(b1, b2); } 不是静态的。 该代码适用于T()::size()size()。那么现在的问题是,有什么区别?这些方法中的任何一种是否更正确或更佳?

2 个答案:

答案 0 :(得分:0)

您没有指定要使用的编译器,但是gcc的错误消息提供了一个很大的提示:

t.C:12:52: error: cannot call member function ‘constexpr size_t A<S>::size() const
[with long unsigned int S = 123; size_t = long unsigned int]’ without object

相应地调整方法的声明后:

static constexpr size_t size() noexcept { return S; }

gcc然后编译显示的代码,没有问题。

如果您的意图是使size()成为常规类方法,那么您需要在模板中使用std::declval而不是将其作为静态方法来调用。

答案 1 :(得分:0)

size是一个非静态函数,需要一个对象来调用。使其static并删除const