gpt4 book ai didi

c++ - 如何防止类型被用作结构/类中的成员变量类型?

转载 作者:太空狗 更新时间:2023-10-29 21:01:47 26 4
gpt4 key购买 nike

我想创建只能用作完整类型而不是成员变量类型的类型。

所以对于这样的 T 类型,这是允许的:

T a;
^^^
int foo(T b);
^^^
struct C { int foo(T b); };
^^^
int main() { T c; }
^^^

但这会导致编译时错误:

struct C { T a; };
^^^

我非常想展示到目前为止我尝试过的任何东西,但没有任何东西至少可以接近我需要的解决方案,为此感到抱歉。

当然,我也接受证明这在 C++ 中是不可能的答案。

为什么我需要这个?我想要智能指针,它不能是另一个对象的元素。防止循环依赖的糟糕方法......

最佳答案

你不能。从 C++ 语法(强调是我的,为了清楚起见,省略了相关部分)函数的声明是:


function-definition:<br/>
decl-specifier-seq<sub>opt</sub> <strong>declarator</strong> ctor-initializer<sub>opt</sub> function-body<br/>
decl-specifier-seq<sub>opt</sub> <strong>declarator</strong> function-try-block

对于类来说是:


class-specifier:<br/>
class-head { member-specification<sub>opt</sub> }<br/>
<br/>
member-specification:<br/>
member-declaration member-specification<sub>opt</sub><br/>
access-specifier : member-specification<sub>opt</sub><br/>
<br/>
member-declaration:<br/>
decl-specifier-seq<sub>opt</sub> member-declarator-list<sub>opt</sub> ;<br/>
function-definition <sub>;opt</sub><br/>
<sub>::opt</sub> nested-name-specifier template<sub>opt</sub> unqualified-id ;<br/>
using-declaration<br/>
template-declaration<br/>
member-declarator-list:<br/>
member-declarator<br/>
member-declarator-list , member-declarator<br/>
<br/>
member-declarator:<br/>
<strong>declarator</strong> pure-specifier<sub>opt</sub><br/>
<strong>declarator</strong> constant-initializer<sub>opt</sub><br/>
identifieropt : constant-expression<br/>

最后declarator是:


declarator:<br/>
direct-declarator<br/>
ptr-operator declarator<br/>
<br/>
direct-declarator:<br/>
declarator-id<br/>
direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq<sub>opt</sub><br/>exception-specification<sub>opt</sub><br/>
direct-declarator [ constant-expression<sub>opt</sub> ]<br/>
( declarator )<br/>

如您所见,可用作函数参数的类型也可用作类成员。

关于c++ - 如何防止类型被用作结构/类中的成员变量类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17217934/

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