class Program {
static final int var;
static {
Program.var = 8; // Compilation error
}
public static void main(String[] args) {
int i;
i = Program.var;
System.out.println(Program.var);
}
}
Run Code Online (Sandbox Code Playgroud)
class Program {
static final int var;
static {
var = 8; //OK
}
public static void main(String[] args) {
System.out.println(Program.var);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么案例1会导致编译错误?
我正在写使用一些有用的功能像其他一些包R里面的函数stringr
和base64enc
.是不是首先要调用library(...)
或者require(...
加载这些包,而是::
用来直接引用我需要的函数,比如stringr::str_match(...)
?
在一般情况下这是一个好习惯吗?或者它会引起什么问题?
我想在两个不同的Haskell模块之间使用相同的中缀运算符(<*>
)进行名称冲突.Haskell 98报告说
modid.varsym
Run Code Online (Sandbox Code Playgroud)
是允许的,但我不能让它工作.这里完整的是Test.hs
:
module Test
where
import qualified Test2 as T
three = T.<*>
Run Code Online (Sandbox Code Playgroud)
并且Test2.hs
:
module Test2
where
(<*>) = 3
Run Code Online (Sandbox Code Playgroud)
但是尝试编译结果会出现错误消息:
Test.hs:6:12: parse error on input `T.<*>'
Run Code Online (Sandbox Code Playgroud)
我尝试过,T.(<*>)
但这也不起作用.
如何引用由导入的模块中定义的符号名称import qualified
?
MSVC, Clang and GCC disagree on this code:
struct Base { int x; };
struct Der1 : public Base {};
struct Der2 : public Base {};
struct AllDer : public Der1, public Der2 {
void foo() {
Der1::Base::x = 5;
}
};
Run Code Online (Sandbox Code Playgroud)
GCC:
<source>: In member function 'void AllDer::foo()':
<source>:10:21: error: 'Base' is an ambiguous base of 'AllDer'
10 | Der1::Base::x = 5;
| ^
Compiler returned: 1
Run Code Online (Sandbox Code Playgroud)
Clang gives a similar error, and MSVC gives no error.
Who …
c++ multiple-inheritance qualified-name diamond-problem language-lawyer
这个问题让我想知道在类外成员函数定义中完全限定类名(包括全局作用域运算符)是否有用/必需。
一方面,我以前从未见过这样做(正确执行的语法似乎还不清楚)。另一方面,C ++名称查找非常简单,因此可能存在极端情况。
题:
是否曾经有过引入超出成员函数定义的定义
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
不同于
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }
(没有全局作用域::
前缀)的情况?
请注意,成员函数定义必须放在封闭类的名称空间中,因此这不是有效的示例。
c++ qualified-name global-scope name-lookup scope-resolution-operator
在Haskell中,我可以导入一个由其名称或快捷方式名称限定的模块,如下所示:
import qualified Data.List as List
import qualified Data.Map
Run Code Online (Sandbox Code Playgroud)
我还可以从模块中仅导入一组选定的函数,或者导入除选择集以外的所有函数,如下所示:
import Data.List (sort, intersperse)
import Data.Map hiding (findWithDefault)
Run Code Online (Sandbox Code Playgroud)
是否可以导入一组特定的函数,import Data.List (sort, intersperse)
如上例所示,但是要确保仍然以合格的方式识别函数,例如List.sort
和List.intersperse
?
虽然这不起作用,但这是我所要求的精神:
import qualified Data.List (sort, intersperse) as List
Run Code Online (Sandbox Code Playgroud)
也许
import qualified Data.List as List (sort, intersperse)
Run Code Online (Sandbox Code Playgroud) 我们编程课程中的老师正在谈论"不合格的名字",但我想知道他们到底是什么.
我怀疑方法名称之类的东西是不合格的,但我不确定.
有没有人可以向我解释这个?我需要知道这一点,因为我需要解释Java看起来像一个不合格的名称.
不允许将名称空间和具有相同名称的类放入一个声明性区域,即
namespace A {}
class A{};
Run Code Online (Sandbox Code Playgroud)
形成不良(见§3.3.1/ 4).但是,可以通过using-directive引入任一个的名称:
namespace N { namespace A {int i;} }
struct A {static int i;};
using namespace N;
int i = A::i; // The global struct, or namespace N::A?
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)main.cpp:7:9: error: reference to 'A' is ambiguous int i = A::i; ^ main.cpp:3:8: note: candidate found by name lookup is 'A' struct A {static int i;}; ^ main.cpp:1:25: note: candidate found by name lookup is 'N::A' namespace N …
最近,我注意到,有可能:
class Test {
public enum Season { WINTER, SPRING, SUMMER, FALL }
Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible?
}
Run Code Online (Sandbox Code Playgroud)
是否有一个原因?
当第一个声明被注释掉时,以下命名空间定义无法编译.如果第一个声明foo
是取消注释的,那么它编译就好了.
namespace Y
{
//void foo();
void ::Y::foo(){}
}
Run Code Online (Sandbox Code Playgroud)
标准中的相关部分(§8.31)说:
当declarator-id被限定时,声明应引用先前声明的成员
据我所知,此规则可防止将名称引入其他名称空间.我想知道是否可以放宽该规则以允许引用当前命名空间的qualified-id.
qualified-name ×10
c++ ×4
java ×3
haskell ×2
name-lookup ×2
namespaces ×2
declaration ×1
enums ×1
final ×1
global-scope ×1
identifier ×1
import ×1
r ×1
scope ×1
scoping ×1
static ×1
syntax ×1