我第一次在Java中使用泛型,我面临一个我无法克服的问题:为什么这会编译:
public interface Aa{}
public interface Bb{}
public interface Cc{}
public static <GenericAB extends Aa & Bb>
void method(GenericAB myABobject1, GenericAB myABobject2){}
public static <GenericAB extends Aa & Bb, GenericCA extends Cc & Aa>
void method(GenericAB myAbobject, GenericCA myCAobject){}
Run Code Online (Sandbox Code Playgroud)
但这不是:
public interface Aa{}
public interface Bb{}
public interface Cc{}
public static <GenericAB extends Aa & Bb>
void method(GenericAB myABobject1, GenericAB myABobject2){}
public static <GenericAB extends Aa & Bb, GenericAC extends Aa & Cc>
void method(GenericAB myAbobject, GenericAC myACobject){}
Run Code Online (Sandbox Code Playgroud)
我得到这个错误:两种方法都有相同的擦除 …
我一直在敲打我的头在这个问题上几天,我读了很多文件和有关新的C ++ 20个模块。其中职位的这名负责人一个,这一个和#2这等一个,但我真的不解决这个问题.
我使用的是随Visual Studio Preview 16.6.0 2.0一起提供的 MSVC 编译器。我知道它还不是一个稳定的版本,但我想弄乱新功能来开始学习它们。
基本上,我编写了一个模块 ( myModule) 和该模块的 2 个分区 ( mySubmodule1and mySubmodule2),并在两个模块实现文件 ( mySubmodule1Impl.cppand mySubmodule2Impl.cpp) 中实现了它们。
mySubmodule1依赖于mySubmodule2,反之亦然。这是来源:
mySubmodule1.ix
export module myModule:mySubmodule1;
export namespace myNamespace{
class MyClass2;
class MyClass1{
public:
int foo(MyClass2& c);
int x = 9;
};
}
Run Code Online (Sandbox Code Playgroud)
mySubmodule2.ix
export module myModule:mySubmodule2;
import :mySubmodule1;
export namespace myNamespace{
class MyClass2 {
public:
MyClass2(MyClass1 x);
int x = 14; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 C++20 概念,开始熟悉它们。我对简单的概念感到很舒服,例如使用标准概念movable我可以写这样的东西(在所有示例中,我想我using namespace std和我都包括在内,<concepts>并且需要任何其他标题):
template<movable T>
int foo (T obj);
Run Code Online (Sandbox Code Playgroud)
并确保在调用此函数时obj可以移动传递的对象。我什至可以用更长的形式写这个:
template<typename T>
requires movable<T>
int foo (T obj);
Run Code Online (Sandbox Code Playgroud)
结果是一样的(我认为)。
但是现在让我们看看另一个概念,例如same_as. same_as需要 2 个模板参数(要比较的 2 种类型),所以我可以写:
template<typename T>
requires same_as<T, string>
int bar (T obj);
Run Code Online (Sandbox Code Playgroud)
现在 T 是string。但是我怎样才能写成更短的形式呢?我试过了,我可以写这个(正如我直觉所期望的):
template<same_as<string> T>
int bar (T obj);
Run Code Online (Sandbox Code Playgroud)
但是这种形式背后的正式规则是什么?
函数模板参数的名称( T)是否作为概念模板的第一个参数输入?或者也许是最后一次?我不知道,关于这个主题的信息很少。我的意思是,在这个例子中它是无关紧要的,因为same_as<A, B> 在语义上等同于same_as<B, A>,但在某些情况下,顺序很重要。
我知道有类似标题的问题,例如this one,但它提出了不同的问题。
这些是我试图从中获取信息但失败的资源:cppReference、cppModernes、 …
我已经使用AS几个月了,但是自从两天以来,尝试运行我的应用程序时出现错误:
Unable to run 'adb': null
'C:\Users\lapof\AppData\Local\Android\Sdk\platform-tools\adb.exe start-server' failed -- run manually if necessary
* daemon not running; starting now at tcp:5037
could not read ok from ADB Server
* failed to start daemon
error: cannot connect to daemon
Run Code Online (Sandbox Code Playgroud)
我读过很多人遇到此问题的信息,但是提供的解决方案对我不起作用。我特别阅读以下问题:
这些问题的很多答案都说要从任务管理器中关闭adb.exe,问题是adb.exe没有运行,如果我尝试通过.\adb start-server在PowerShell窗口中键入来重新启动它,则会遇到相同的错误。
我也尝试重新启动我的PC,但是它不起作用。在我要连接的Android设备上(三星Galaxy S8),我启用了USB调试功能。我什至尝试删除所有授权的设备,但没有任何效果。
我检查了其他进程是否使用了5037端口,但adb.exe使用了5037端口(并且该端口的防火墙状态是允许的,但不受限制)。顺便说一句,正如我所说,在任务管理器中没有adb.exe。
最后,我尝试遵循我所链接的最后一个问题中提供的说明(基本上,我重新下载了adb.exe)。最初我跑了.\adb start-server,出现了这个奇怪的错误:
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
** daemon …Run Code Online (Sandbox Code Playgroud) c++ ×2
c++20 ×2
adb ×1
android ×1
c++-concepts ×1
c++-modules ×1
generics ×1
java ×1
templates ×1
type-erasure ×1
visual-c++ ×1