gpt4 book ai didi

c++ - 让 Friend 成为模板类的构造函数

转载 作者:行者123 更新时间:2023-11-30 01:47:00 25 4
gpt4 key购买 nike

最近我开始使用模板。我只是转储了一个编译错误。

我有一个类模板 Foo这需要一个 bool 值 B作为模板参数。我正试图以 Foo 的形式交 friend 使用模板参数 b , Foo 的另一个实例化的构造函数,参数为 !b使用此代码:

template<bool B>
class Foo
{
public:
Foo(Foo<!B>&);
private:
friend Foo<!B>::Foo(Foo<B>&);
};

编译器返回这些错误:

test.cpp:22:18: error: C++ requires a type specifier for all declarations
friend Foo<!B>::Foo(Foo<B>&);
~~~~~~ ^
test.cpp:22:18: error: constructor cannot have a return type
friend Foo<!B>::Foo(Foo<B>&);
^~~
2 errors generated.

我用以下命令编译它:clang++ -std=c++11 foo.cpp在 Windows 上。

我真的不明白如何让它工作,感谢任何有助于理解问题所在的帮助。

最佳答案

我在评论别人的回答,他们让我把我的分析贴在这里。

我认为你的情况有问题,因为 Foo<true>有 friend 声明给Foo<false>的成员函数又引用 Foo<true>的成员函数。虽然成员分别声明在成员函数之前,但编译器不支持这种循环引用。 GCC 在实例化时提示

main.cpp: In instantiation of 'class Foo<false>':
main.cpp:9:12: required from 'class Foo<true>'
main.cpp:15:49: required from here
main.cpp:9:12: error: invalid use of incomplete type 'class Foo<true>'
friend Foo<!B>::Foo(Foo<B>&);

此错误消息有点令人困惑,因为它表明不完整的类型不能与 :: 一起使用,这是错误的。正在定义的类可以与 :: 一起使用即使它还不完整。但是,GCC 对正在实例化的类的处理方式与正在定义的类不同,并且 GCC 显然不支持引用以限定名称实例化的类。

我们有关于此类循环引用的 DR,http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#287这似乎使这合法,但正如最后的声明所指出的那样,“这需要工作”,所以 GCC 有权拒绝我会说的代码。为了增加这种困惑,我们还有一个明确的规则用于友元函数声明中使用的名称,这在 DR287 中没有提到,它的“好像”会使您的代码格式错误,因为 Foo<!B>的实例化点紧接在 Foo<B> 的实例化点之前除非我们应用 DR287 中的规则,否则看不到 Foo<B> 的构造函数声明.

Friend classes or functions can be declared within a class template. When a template is instantiated, the names of its friends are treated as if the specialization had been explicitly declared at its point of instantiation


与此无关,手头还有另一个问题:是 Foo<!B>::Foo(Foo<B>&);指的是构造函数?如果它引用注入(inject)的类名,则它是对构造函数的引用,然后编译器必须将其视为这些上下文中的构造函数。所以编译器必须解析 Foo<!B>::Foo .但是Foo<!B>是一个依赖类型,所以编译器无法查看它来决定它是什么类型的名称(记住 struct A { int A; } 是允许的,编译器必须验证它不在这种情况下)。我认为由于这些原因,cland 无法解析您的模板,因为它对 friend Foo<!B>::Foo(Foo<B>&) 的内容感到困惑。方法。

相信模板本身(忽略实例化问题)应该是格式良好的,因为编译器可能会延迟对 Foo<!B>::Foo 的查找。并将其视为实际的非类型(构造函数)。

关于c++ - 让 Friend 成为模板类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32285085/

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