gpt4 book ai didi

c++ - 为什么声明顺序对于将成员函数指针作为模板参数传递很重要?

转载 作者:IT老高 更新时间:2023-10-28 21:34:23 24 4
gpt4 key购买 nike

看看这段代码:

template <typename T, void (T::*pfn)()> struct Testee {};

class Tester
{
private:
void foo() {}
public:
using type_t = Testee<Tester, &Tester::foo>;
};

使用 g++ -std=c++14 -Wall -Wextra 编译成功。

但是,当我改变footype_t的顺序时,出现错误:

$ cat test.cpp
template <typename T, void (T::*pfn)()> struct Testee {};

class Tester
{
public:
using type_t = Testee<Tester, &Tester::foo>;
private:
void foo() {}
};

int main()
{
}

$ g++ -std=c++14 -Wall -Wextra -pedantic test.cpp
test.cpp:6:36: error: incomplete type ‘Tester’ used in nested name specifier
using type_t = Testee<Tester, &Tester::foo>;
^
test.cpp:6:47: error: template argument 2 is invalid
using type_t = Testee<Tester, &Tester::foo>;
^

通常,类定义中的声明顺序对名称解析没有影响。例如:

struct A // OK
{
void foo(int a = val) { }
static constexpr const int val = 42;
};

struct B // OK
{
static constexpr const int val = 42;
void foo(int a = val) { }
};

但是,它在这种情况下会产生影响。为什么?

最佳答案

这实际上与模板无关。你会得到一个类似的 error上:

class Tester
{
public:
using type_t = decltype(&Tester::foo);
private:
void foo() {}
};

一个类确实是(标准9.2/2):

regarded as complete within function bodies, default arguments, using-declarations introducing inheriting constructors (12.9), exception-specifications, and brace-or-equal-initializers for non-static data members (including such things in nested classes).

但是,成员类型的定义不在该列表中,因此它只能使用在该点之前声明的名称。

关于c++ - 为什么声明顺序对于将成员函数指针作为模板参数传递很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44456100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com