我在代码库中有一个类似于以下内容的库:
namespace rat {
...
enum myEnum {
BLUE,
RED
}
...
} //namespace rat
Run Code Online (Sandbox Code Playgroud)
之后我尝试使用该库在代码库中编译一个应用程序,当我使用命名空间rat(代码库主命名空间)说BLUE可能是rat::myEnum rat::BLUE或者rat::enums::Freq rat::enums::BLUE来自我不熟悉的其他文件时,它警告我有歧义(并且不是我的)有一个枚举Freq,在名称空间鼠标中的名称空间枚举中有一个名为BLUE的人...
用户代码中有没有办法说出我现在想要哪一个?或者我必须在名称空间mylib中嵌套mylibs枚举,然后说rat :: enums :: BLUE或rat :: mylib :: BLUE?
我可以让内置的类型,如int与double在C++命名空间中可用?
#include <complex>
typedef int my_int;
namespace my_namespace {
namespace std = ::std; // Works
using ::my_int; // Works
using ::int; // Fails: "expected unqualified-id before 'int'"
typedef ::int int; // Fails: "expected unqualified-id before 'int'"
}
typedef int out::int; // Fails: "expected unqualified-id before 'int'"
my_namespace::my_int x; // Works
my_namespace::std::complex<int> c; // Works
// I would like to use this:
my_namespace::int x2; // Fails: "expected unqualified-id before 'int'"
Run Code Online (Sandbox Code Playgroud)
我怀疑这是由于语言限制,禁止在其中使用带有关键字的限定标识符(int在本例中),但我希望有一些方法可以揭示这些.
我正在尝试使用命名空间来组织类型,以便外部工具(SWIG)可以适当地用另一种语言包装函数.例如: …
可能重复:
为什么C#不允许像C++这样的非成员函数
而不是写StaticClass.Function()我想简单写Function().将有许多功能,所有功能都应该可以从不同的(和不相关的)类和文件访问.如何将这些函数放在特定的命名空间中?简单地声明它会给我一个编译错误
error CS1518: Expected class, delegate, enum, interface, or struct
Run Code Online (Sandbox Code Playgroud)
我知道其他.NET语言可以做到这一点.我可以使用编译选项吗?也许甚至没有证件?
认真地让我紧张.这段代码工作得很好,我重新启动了IDE(Visual Studio 2010),现在突然代码变得疯狂了.错误日志是巨大的,我不知道是什么导致它,因为代码似乎非常正确.
1>ClCompile:
1> uicont.cpp
1>c:\users\jesse\documents\visual studio 2010\projects\mage3d\mage3d\include\mage\gui\uicontext.h(21): error C2653: 'GUI' : is not a class or namespace name
1>c:\users\jesse\documents\visual studio 2010\projects\mage3d\mage3d\include\mage\gui\uicontext.h(21): error C2143: syntax error : missing ';' before '*'
1>c:\users\jesse\documents\visual studio 2010\projects\mage3d\mage3d\include\mage\gui\uicontext.h(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\jesse\documents\visual studio 2010\projects\mage3d\mage3d\include\mage\gui\uicontext.h(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Run Code Online (Sandbox Code Playgroud)
还有更多,但我认为这是造成错误的原因.以下是问题最多的文件的源代码.
法/ GUI/UIContext.h
#include <OGRE/OgreString.h>
#include <OGRE/OgreOverlay.h>
#include <OGRE/OgreOverlayManager.h>
#include <vector>
#include <Mage/GUI/Frame.h>
#ifndef …Run Code Online (Sandbox Code Playgroud) 假设我有以下代码:
namespace x{
class X{
virtual void x(){}
}
}
namespace y{
class Y : public x::X{
void x(){}
}
}
int main(){
x::X* a = new y::Y();
a->x::X::x(); //Tries to access x::X::x non-virtually.
//Fails, since it treats the first x as the
//function name instead of the namespace
}
Run Code Online (Sandbox Code Playgroud)
如您所见,main方法的最后一行尝试静态调用类x :: X的x方法(即非虚拟).但是,这会失败,因为命名空间与方法具有相同的名称(两者都命名为x).因此,编译器将第一个x视为方法名称,然后抱怨x :: X没有任何意义.
这个问题在初看起来似乎是假设的,但它确实出现在我们的代码中:命名空间不能轻易地重命名,因为它是一个大项目的命名空间.方法名称无法更改,因为它必须遵守我们的范围之外的其他超类(库类).
那么,有没有机会以某种方式消除这种语法的歧义,以便我仍然可以非虚拟地调用方法x :: X :: x?
现在,我看到的唯一解决方案是x = X,然后使用typedef.有没有typedef的解决方案吗?
我知道标题有点模糊,但我现在想不出更好的标题.我的代码中的摘录如下所示:
#include<iostream>
#include<fstream>
int main(){
ifstream f("cuvinte.txt");
f.getline(cuvant);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我想阅读"cuvinte.txt"中的下一个单词时,我写了f.getline(cuvant); 但我得到以下错误
error C2661: 'std::basic_istream<_Elem,_Traits>::getline' : no overloaded function takes 1 arguments
Run Code Online (Sandbox Code Playgroud)
我不知道问题是什么,我不久前偶然发现了这个问题,仍然无法超越它.
来自MDN:
使用
with不推荐,并在ECMAScript中5严格模式是被禁止的.建议的替代方法是将要访问其属性的对象分配给临时变量.
这似乎是一个伟大/有用/方便的功能.为什么不赞成?还有哪些方法可以达到这种效果?我不想去:
veryLongNS.y = veryLongNS.myFunc(veryLongNS.x);
veryLongNS.z = 6;
veryLongNS.otherFunc();
veryLongNS.a = {
a:1,
b:2,
c:veryLongNS.processThree(3)
};
Run Code Online (Sandbox Code Playgroud) 我们在一个类中有一个getter方法.在同一个JAR中,我们希望可以使用无标识符访问级别从相同的包和子包访问该变量.
访问级别下面是:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
我们的问题是,我们如何阻止某人采用已编译的.JAR,创建具有相同包命名空间定义的类,并能够通过getter访问我们的变量?
我们考虑去除特定变量的所有getter,并将变量值赋给其他具有setter和构造函数的类,当它们传递对自己的引用时.显然,他们将是最后的课程.这样,需要变量值的所有对象都有自己的私有副本.
我想知道是否有更好的方法?
"每个实体类型一个memcache命名空间"是个好主意?与单个命名空间相比时的任何其他影响?
MemcacheServiceFactory.getMemcacheService("K1");
MemcacheServiceFactory.getMemcacheService("K2");
MemcacheServiceFactory.getMemcacheService("K3");
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
typedef struct Y {int X;} X;
enum E {X};
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
错误:'X'重新声明为不同类型的符号
据我所知,C隐式定义了结构,联合和枚举标记以及它们的成员的名称空间.所以,我不确定为什么会E::X碰到typedef结构标签X?
C中的名称空间究竟是什么?