我应该如何命名这些类?

How should I name these classes?

我有两组不同的 classes,它们继承自两个不同的基础 classes(ValueToken)。

在这两个组中,我都有 class 我会简单地称为 StringNumberName,只要他们的名字不与 class 其他组的名字。

所以基本上我需要一种方法来区分继承自 Value 的 class String 和继承自 [=12] 的 class String =],我不知道该怎么做。

我不能将它们放在它们的基 class 的命名空间中,因为你继承自它们所在的同一个 class 并且编译器给我一个 "invalid use of incomplete type" 错误。我该如何解决?

呼叫一个 StringValue 和另一个 StringToken?

简单的解决方法是将它们命名为 StringValueStringToken.

你不能在它们的基础 class 中定义它们,例如:

struct Value
{
    struct String : Value {};
};

但是您可以定义它们和命名空间内的基础class:

namespace Value
{
    struct Base {};
    struct String:Base {};
}

然后参考Value::BaseValue::String.

虽然我非常喜欢名称空间,但在这种特殊情况下,我会倾向于 StringValue 解决方案。

(注意:我在示例中使用了 struct,因为它避免了与 public 的所有混乱。对于实际代码,您可能想要使用 class。)

这些命名空间应该没有问题。

struct Value {};
struct Token {};

namespace Values { struct String : Value {}; }
namespace Tokens { struct String : Token {}; }

应该工作,应该工作

namespace Values { struct Value {}; struct String : Value {}; }
namespace Tokens { struct Token {}; struct String : Token {}; }

有一件事是行不通的

struct Value
{
    struct String : public Value {};
}; 

因为当您试图从它继承时 Value 没有完全定义。
如果这是你正在做的,解决办法就是不要那样做。