Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++ 在模板定义中调用非静态constexpr成员函数_C++_C++17 - Fatal编程技术网

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

C++ 在模板定义中调用非静态constexpr成员函数,c++,c++17,C++,C++17,在*行的原始问题中,我错误地使用了T::size,这显然是错误的,因为大小不是静态的。 该代码使用T.size和std::declval.size。因此,现在的问题是区别是什么,这些方法中是否有一种更正确或更好?您没有指定使用哪种编译器,但gcc的错误消息提供了一个巨大的提示: #include <type_traits> template<size_t S> struct A { constexpr size_t size() const noexcept {

在*行的原始问题中,我错误地使用了T::size,这显然是错误的,因为大小不是静态的。
该代码使用T.size和std::declval.size。因此,现在的问题是区别是什么,这些方法中是否有一种更正确或更好?

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

#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);
}
gcc然后编译了显示的代码,没有任何问题


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

size是一个非静态函数,需要调用一个对象。将其设置为静态并删除常量。

看起来您希望大小是静态的。但随后您将对其进行限定,就像非静态成员一样。哪一个?@StoryTeller UnslanderMonica大小不能是静态的。@PowerGamer:那么不要在这里使用大小。改为使用静态constexpr函数/变量。您已经完全改变了问题:这对未来的读者来说非常混乱:两个答案对您的原始问题是正确的,对新版本没有意义。您应该创建新问题,而不是修改问题。
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; }