如何将 typedef(使用声明)和一堆 类 共有的常量分组并在内部使用它们?
How to group typedefs (using declarations) and constants common to a bunch of classes and using them inside?
我正在尝试找到一种方法将我的项目使用的主要类型和常量分组到一个命名空间中,然后我想将它们导入到我的所有 类 中,使用“使用命名空间”。我不明白为什么这段代码不能编译,g++ 错误说:
expected nested-name-specifier before 'namespace'
我有什么选择可以将所有类型和常量组合在一起?我尝试使 Traits 成为一个结构,然后使用继承,但这给模板带来了问题,另一种方法是在所有 类 中编写类似的东西:
using scalar_t = Traits::scalar_t;
感谢您的提示。
#include <iostream>
namespace Traits {
constexpr int N = 3;
using scalar_t = double;
};
struct Entity {
using namespace Traits; // problems here
scalar_t foo() const;
int n = N;
};
scalar_t Entity::foo() const { return N; } // problems here
int main()
{
Entity e;
e.foo();
return 0;
}
该语言实际上不允许您在 class 范围内导入命名空间。您可以通过添加另一个间接级别来解决这个问题,即。将您的 class 包装在一个命名空间中,您当然可以在其中导入其他命名空间。
namespace Indirection
{
using namespace Traits; // ok at namespace scope
// now everything from Traits is avaliable
struct Entity
{
scalar_t foo() const; // scalar_t is visible, yay!
int n = N;
};
scalar_t Entity::foo() const { return N; } // also ok, since in same namespace
}
当然,您不想再提及 Indirection
命名空间,因此您可以将 Entity
从该命名空间中移除。
using Indirection::Entity;
现在好像 Indirection
根本不存在。
这是 demo。
我正在尝试找到一种方法将我的项目使用的主要类型和常量分组到一个命名空间中,然后我想将它们导入到我的所有 类 中,使用“使用命名空间”。我不明白为什么这段代码不能编译,g++ 错误说:
expected nested-name-specifier before 'namespace'
我有什么选择可以将所有类型和常量组合在一起?我尝试使 Traits 成为一个结构,然后使用继承,但这给模板带来了问题,另一种方法是在所有 类 中编写类似的东西:
using scalar_t = Traits::scalar_t;
感谢您的提示。
#include <iostream>
namespace Traits {
constexpr int N = 3;
using scalar_t = double;
};
struct Entity {
using namespace Traits; // problems here
scalar_t foo() const;
int n = N;
};
scalar_t Entity::foo() const { return N; } // problems here
int main()
{
Entity e;
e.foo();
return 0;
}
该语言实际上不允许您在 class 范围内导入命名空间。您可以通过添加另一个间接级别来解决这个问题,即。将您的 class 包装在一个命名空间中,您当然可以在其中导入其他命名空间。
namespace Indirection
{
using namespace Traits; // ok at namespace scope
// now everything from Traits is avaliable
struct Entity
{
scalar_t foo() const; // scalar_t is visible, yay!
int n = N;
};
scalar_t Entity::foo() const { return N; } // also ok, since in same namespace
}
当然,您不想再提及 Indirection
命名空间,因此您可以将 Entity
从该命名空间中移除。
using Indirection::Entity;
现在好像 Indirection
根本不存在。
这是 demo。