Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将TypeDef(使用声明)和常量分组到一组类中,并在内部使用它们?_C++_Scope_Namespaces_Traits_Using - Fatal编程技术网

C++ 如何将TypeDef(使用声明)和常量分组到一组类中,并在内部使用它们?

C++ 如何将TypeDef(使用声明)和常量分组到一组类中,并在内部使用它们?,c++,scope,namespaces,traits,using,C++,Scope,Namespaces,Traits,Using,我试图找到一种方法,将我的项目使用的主要类型和常量分组到一个名称空间中,然后我想用“使用名称空间”将它们导入我的所有类中。我不明白为什么这段代码不能编译,g++错误说: expected nested-name-specifier before 'namespace' 要将所有类型和常量组合在一起,我需要哪些选项?我尝试将Traits设置为一个结构,然后使用继承,但这会给模板带来问题,另一种方法是在所有类中编写如下内容: using scalar_t = Traits::scalar_t;

我试图找到一种方法,将我的项目使用的主要类型和常量分组到一个名称空间中,然后我想用“使用名称空间”将它们导入我的所有类中。我不明白为什么这段代码不能编译,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;
}
#包括
名称空间特性{
constexpr int N=3;
使用标量t=double;
};
结构实体{
使用名称空间特性;//这里有问题
标量foo()常量;
int n=n;
};
标量实体::foo()常量{return N;}//这里有问题
int main()
{
实体e;
e、 foo();
返回0;
}

该语言实际上不允许您在类范围内导入命名空间。您可以通过添加另一个间接级别来解决此问题,即。将类包装在名称空间中,当然可以在其中导入其他名称空间

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
}
当然,您不想再提及
间接
名称空间,因此您可以将
实体
从该名称空间中取出

using Indirection::Entity;
而现在,它似乎根本就不存在“间接的”


这里有一个问题。

该语言实际上不允许您在类范围内导入名称空间。您可以通过添加另一个间接级别来解决此问题,即。将类包装在名称空间中,当然可以在其中导入其他名称空间

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
}
当然,您不想再提及
间接
名称空间,因此您可以将
实体
从该名称空间中取出

using Indirection::Entity;
而现在,它似乎根本就不存在“间接的”


这里有一个。

结构的主体不是可以放置
using namespace
指令的地方<代码>实体::标量\u t-
实体
不拥有该类型。在头文件中使用编写
时应该非常小心。结构体不是可以放置
使用命名空间
指令的位置<代码>实体::标量\u t
-
实体
不拥有该类型。在头文件中使用编写
时应该非常小心。