我在类中找到了这行代码,我必须修改它:
::Configuration * tmpCo = m_configurationDB;//pointer to current db
Run Code Online (Sandbox Code Playgroud)
而且我不知道究竟是什么意思是双重冒号前面的类名.没有它我会读:声明tmpCo作为指向类的对象的指针Configuration...但前面的双冒号混淆了我.
我还发现:
typedef ::config::set ConfigSet;
Run Code Online (Sandbox Code Playgroud) C++语法struct A::B:A {};是什么意思?C++标准中描述的名称定义(或访问)在哪里?
#include <iostream>
struct B;
struct A {
struct B;
};
struct A::B:A {
};
int main() {
A::B::A::B b;
std::cout<<"Sizeof A::B::A::B is " << sizeof(A::B::A::B)<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个简单的vim问题,谷歌没有设法帮助我.任何想法都表示赞赏.
我执行以下搜索并替换:
:s/numnodes/numnodes1/g
Run Code Online (Sandbox Code Playgroud)
在包含以下文本的文件中:
numprocs=0
numnodes=0
Run Code Online (Sandbox Code Playgroud)
我明白了
E486: Pattern not found
Run Code Online (Sandbox Code Playgroud)
绿色方块的位置表明我开始打字的位置明显高于模式.我试图寻找其他不涉及正则表达式的短语,这些短语也存在,但也失败了.简单/ numnodes按预期突出显示匹配项.有谁知道vim可能有什么问题?
(我知道范围解析运算符的作用,以及如何以及何时使用它.)
为什么C++有::运算符,而不是.为此目的使用运算符?Java没有单独的运算符,并且工作正常.C++和Java之间是否有一些区别,这意味着C++需要一个单独的运算符才能进行解析?
我唯一的猜测是::出于优先原因需要,但我不能认为为什么它需要具有比例如更高的优先级..我能想到的唯一情况就是如此
a.b::c;
Run Code Online (Sandbox Code Playgroud)
将被解析为
a.(b::c);
Run Code Online (Sandbox Code Playgroud)
,但我无法想到任何情况下,这样的语法无论如何都是合法的.
也许这只是"他们做不同的事情,所以他们可能看起来不同"的情况.但这并不能解释为什么::优先级高于..
在C++中,阴影变量名称的范围分辨率("优先顺序")是多少?我似乎无法在网上找到简明的答案.
例如:
#include <iostream>
int shadowed = 1;
struct Foo
{
Foo() : shadowed(2) {}
void bar(int shadowed = 3)
{
std::cout << shadowed << std::endl;
// What does this output?
{
int shadowed = 4;
std::cout << shadowed << std::endl;
// What does this output?
}
}
int shadowed;
};
int main()
{
Foo().bar();
}
Run Code Online (Sandbox Code Playgroud)
我想不出变量可能会发生冲突的任何其他范围.如果我错过了,请告诉我.
shadow在bar成员函数内部时,所有四个变量的优先级顺序是多少?
有了像Foo这样的课程:
struct Foo { static const int i = 9; };
Run Code Online (Sandbox Code Playgroud)
我发现GCC 4.5将拒绝以下内容
Foo f;
int x = decltype(f)::i;
Run Code Online (Sandbox Code Playgroud)
如果我使用中间typedef,它将起作用,例如:
typedef decltype(f) ftype;
int x = ftype::i;
Run Code Online (Sandbox Code Playgroud)
但我更喜欢保持命名空间的清洁.我认为优先权可能是一个问题,所以我也试过括号,但没有运气.它是不可能的,或者是否有一段语法可以帮助我?
我见过这样的代码:
std::string str = "wHatEver";
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
Run Code Online (Sandbox Code Playgroud)
我有一个问题:::在tolower之前意味着什么?
并std::tolower没有用,但::tolower工作正常
我想知道C++中的一些东西.
承认以下代码:
int bar;
class Foo
{
public:
Foo();
private:
int bar;
};
Run Code Online (Sandbox Code Playgroud)
在我班上,this->bar和之间有什么区别Foo::bar?是否存在一个无效的情况?
我的问题可以通过以下代码恢复:
template <typename T> struct C2;
template <typename T>
struct C1
{
template <typename Type,
template <typename Ti> class Container = C2>
void m() {}
};
template <typename T>
struct C2
{
template <typename Type = int,
template <typename Ti> class Container = C2> // <-- Here is the problem!
void m() {}
};
Run Code Online (Sandbox Code Playgroud)
gnu编译器版本4.8.1失败,并显示以下消息:
test-temp.C:16:47: error: invalid use of type ‘C2<T>’ as a default value for a template template-parameter
template <typename Ti> class Container = C2>
Run Code Online (Sandbox Code Playgroud)
它指的是方法C2 :: m的默认模板参数C2. …
如果C++中的名称不是完全限定的,例如std::cout,它可能会导致无意的错误,例如https://en.cppreference.com/w/cpp/language/qualified_lookup中提到的.但正如我所注意到的那样,使用名称::std空间的完全限定名称eq ::std::cout是非常罕见的.
是否有任何理由::std不使用名称空间的完全限定名称?
那么为自己创建的命名空间使用完全限定名称呢?这是好主意吗?