我想创建只能用作完整类型的类型,而不是作为成员变量类型。
因此,T
类型应允许这样做:
T a;
^^^
int foo(T b);
^^^
struct C { int foo(T b); };
^^^
int main() { T c; }
^^^
但这会导致编译时错误:
struct C { T a; };
^^^
我非常希望提供我到目前为止所做的任何事情,但没有什么可以至少接近我需要的解决方案,对不起。
当然,我也接受答案,证明这在C ++中是不可能的。
为什么我需要这个?我希望smart pointer
不能成为另一个对象的元素。防止循环依赖的糟糕方法......
答案 0 :(得分:2)
如果您可以在类之外使用对象,则它可以是类的成员。我99.9%肯定你不能以任何方式阻止它(这不会限制你在其他方面使用T
的方式/位置 - 明确拥有私人构造函数会阻止它成为直接成员一个类,但它也会限制它在你正在显示的其他三个场景中使用)。
答案 1 :(得分:2)
你做不到。从C ++语法(重点是我的,为了清楚起见省略了相关部分),函数的声明是:
function-definition:
decl-specifier-seqopt declarator ctor-initializeropt function-body
decl-specifier-seqopt declarator function-try-block
对于课程来说:
class-specifier:
class-head { member-specificationopt }
member-specification:
member-declaration member-specificationopt
access-specifier : member-specificationopt
member-declaration:
decl-specifier-seqopt member-declarator-listopt ;
function-definition ;opt
::opt nested-name-specifier templateopt unqualified-id ;
using-declaration
template-declaration
member-declarator-list:
member-declarator
member-declarator-list , member-declarator
member-declarator:
declarator pure-specifieropt
declarator constant-initializeropt
identifieropt : constant-expression
最后declarator
是:
declarator:
direct-declarator
ptr-operator declarator
direct-declarator:
declarator-id
direct-declarator ( parameter-declaration-clause ) cv-qualifier-seqopt
exception-specificationopt
direct-declarator [ constant-expressionopt ]
( declarator )
正如您所看到的,可以用作函数参数的类型也可以用作类成员。