阅读C++ 17,现在可以在if语句中进行多次初始化:
if (int x = func(), y = func2(); x > 0 && y > 0)
{
}
Run Code Online (Sandbox Code Playgroud)
不错的,也结合了C++ 17中的另一个功能,结构化绑定:
if (auto[iter, success] = set.insert("Hello"); success)
{ }
else
{ }
Run Code Online (Sandbox Code Playgroud)
但是,在VisualStudio 2017中无法编译这两个功能.
if (auto[iter, success] = set.insert("Hello"), [iter2, success2] = set.insert("Foo"); success && success2)
{}
else
{}
Run Code Online (Sandbox Code Playgroud)
失踪 ';' 之前','
这是VS2017中的错误还是不可能?
请考虑以下代码,该代码使用带有CancellationTokenSource的基本任务库功能.它启动一个线程,用字符填充字典并从SQL服务器数据库中读取数据.线程在大约10分钟后结束,每2小时再次触发,在线程仍在运行时先调用Cancel.
private CancellationTokenSource mTokenSource = new CancellationTokenSource();
internal Prices(Dictionary<string, Dealer> dealers)
{
mDealers = dealers;
mTask = Task.Factory.StartNew
(() => ReadPrices(mTokenSource.Token), mTokenSource.Token);
}
internal void Cancel()
{
mTokenSource.Cancel();
}
private void ReadPrices(CancellationToken ct)
{
using (SqlConnection connection =
new SqlConnection(ConfigurationManager.AppSettings["DB"]))
{
connection.Open();
var dealerIds = from dealer in mDealers.Values
where dealer.Id != null
select dealer.Id;
foreach (var dealerId in dealerIds)
{
if (!ct.IsCancellationRequested)
{
FillPrices(connection);
}
else
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在某些时候,应用程序在事件日志中崩溃并出现以下异常.
应用程序:Engine.exe Framework版本:v4.0.30319描述:由于未处理的异常,进程已终止.异常信息:System.AggregateException Stack:at System.Threading.Tasks.TaskExceptionHolder.Finalize()
它必须与这里的代码有关,因为在其他任何地方都没有使用Tasks库,但我无法弄清楚代码有什么问题.有没有人知道这里有什么问题?
尝试创建int到成员函数指针的映射,并在构造函数初始值设定项中初始化它.像这样:
class X
{
using STATEFUNC = void(X::*)(int);
public:
X() : m{ { 1, &setState1 } } {}
void setState1(int x) { cout << "state1" << endl; }
void setState2(int x) { cout << "state2" << endl; }
std::map<int, STATEFUNC> m;
};
Run Code Online (Sandbox Code Playgroud)
我会说这是正确的,但Visual Studio 2017说:
错误C2664'std :: map,std :: allocator >> :: map(std :: initializer_list>)':无法将参数1从'initializer list'转换为'std :: initializer_list>'
错误C2276'&':对绑定成员函数表达式的非法操作
从成员函数中删除运算符的地址时,第一条错误消息保持不变,但第二条错误消息更改为:
错误C3867'X :: setState1':非标准语法; 使用'&'创建指向成员的指针
如何在构造函数初始化列表中初始化int到成员函数指针的映射?
我有一个带有用于 Windows 的 Linux 子系统的 Visual Studio Code 环境,它正在编译和运行一个 Go 项目就好了。
现在我正在尝试按照此链接运行 delve 调试器:
https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code
但我无法让它运行,无论是远程还是本地。
在 launch.json 中尝试了所有类型的配置,但没有命中断点,也没有打印错误消息。
有没有人使用 WSL 在 VSCode 上调试运行?
以下代码创建一个新线程,首先作为命名管道客户端发送参数,然后作为服务器检索结果.之后,它在另一个充当命名管道服务器的AppDomain中执行一个函数,之后作为客户端发回结果.
public OrderPrice DoAction()
{
Task<OrderPrice> t = Task<OrderPrice>.Factory.StartNew(NamedPipeClient, parameters);
if (domain == null)
{
domain = AppDomain.CreateDomain(DOMAINNAME);
}
domain.DoCallBack(AppDomainCallback);
return t.Result;
}
static OrderPrice NamedPipeClient(object parameters) {
OrderPrice price = null;
using (NamedPipeClientStream stream = new NamedPipeClientStream(PIPE_TO)) {
stream.Connect();
SerializeToStream(stream, parameters);
}
using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_BACK)) {
stream.WaitForConnection();
price = (OrderPrice)DeserializeFromStream(stream);
}
return price;
}
void AppDomainCallback() {
OrderPrice price = null;
using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_TO)) {
stream.WaitForConnection();
List<object> parameters = (List<object>)DeserializeFromStream(stream);
if (mi != …Run Code Online (Sandbox Code Playgroud) 以下代码无法使用Visual Studio2017或在线GDB进行编译.我期望它编译,因为迭代器只是一个类型的类,它是公开继承的.这是不允许的还是在VS2017中不起作用?
template<typename T>
struct Gen : public std::iterator<std::input_iterator_tag, T>
{
T value;
};
int main()
{
Gen<int> g = Gen<int>{ 10 }; // this doesnt
Gen<int> g2 = Gen<int>{ {}, 10 }; // neither does this
}
Run Code Online (Sandbox Code Playgroud)
错误是
错误C2440'初始化':无法从'初始化列表'转换为'Gen'
我在这里维护这个代码,通常有如下模式:
StringBuilder result = new StringBuilder();
result.Append("{=" + field.Name + "={");
Run Code Online (Sandbox Code Playgroud)
这样做时,看起来像是浪费了很多无用的对象构造,我想重写一下:
result.Append("{=").Append(field.Name).Append("={");
Run Code Online (Sandbox Code Playgroud)
第一个版本对GC造成的压力更大是否正确?或者是否在C#编译器中使用字符串文字进行了一些优化,其中串联字符串与字符串文字不会创建临时对象?
我使用 BaseHTTPRequestHandler http 服务器并从互联网复制/粘贴代码。这是设置响应/标头的部分
class S(BaseHTTPRequestHandler):
def _set_response(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
Run Code Online (Sandbox Code Playgroud)
但是当使用curl调用服务器时,响应是:
curl: (1) 不允许时收到HTTP/0.9
通过浏览器调用时:
ERR_INVALID_HTTP_RESPONSE
协议版本是 http/1.0
通过nginx反向代理调用Web服务器,这只是
location / {
proxy_http_version 1.1;
proxy_pass http://${NODE_NAME}:9000/;
}
Run Code Online (Sandbox Code Playgroud)
为此还需要更多标头吗?我们如何在 BaseHTTPRequestHandler 或 nginx 中设置正确的 http 标头?
在事务Scope.Eg中使用Nhibernate和ADO.Net操作时,我收到以下异常.Nhibernate 2.1很好,但现在升级到3.0,这会引发错误.
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
GetmemberId(); --> NHibernate Call
Update(); ADO Call OracleDB
}
Run Code Online (Sandbox Code Playgroud)
由于此作为环境事务,NHibernate的尝试很快就处理交易之前外部事务completes.correct我,如果我错了,有没有什么办法,因为帮助我,但是当我移动NHibernate的外呼TransactionScope的一切工作正常.我给出的示例是示例1,mines涉及更复杂的示例,因为我在TransactionScope中保留了两个调用,并且Iam得到的错误如下所示,
错误13 NHibernate.Impl.AbstractSessionImpl - DTC事务预处理阶段失败System.ObjectDisposedException:无法访问已处置的对象.对象名称:'交易'.在System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)在System.Transactions.TransactionScope.SetCurrent(事务newCurrent)在System.Transactions.TransactionScope.PushScope()
在System.Transactions.TransactionScope.Initialize(事务transactionToUse,时间跨度scopeTimeout,布尔interopModeSpecified)在System.Transactions.TransactionScope..ctor(事务transactionToUse)在NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(preparingEnlistment preparingEnlistment)2011-02-08 13:41:46033 ERROR 13 NHibernate.Impl .AbstractSessionImpl - DTC事务预处理阶段失败System.ObjectDisposedException:无法访问已处置的对象.对象名称:'交易'.在System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)在System.Transactions.TransactionScope.SetCurrent(事务newCurrent)在System.Transactions.TransactionScope.PushScope()
在System.Transactions.TransactionScope.Initialize(事务transactionToUse,时间跨度scopeTimeout,布尔interopModeSpecified)在System.Transactions.TransactionScope..ctor(交易transactionToUse)在NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(preparingEnlistment preparingEnlistment)
在我的软件中有这种常见模式,其中完成数据库查询并从该查询创建对象列表,其中对象是从a构造的SqlDataReader.
例如:
public List<Authorization> ReadAuthorizations() {
List<Authorization> authorizations = new List<Authorization>();
using (SqlConnection connection = GetConnection(mConnString)) {
using (SqlDataReader authReader = CmdFactory.Instance.ReadAuthorizations(connection)) {
while (authReader.Read()) {
Authorization auth = new Authorization(authReader);
authorizations.Add(auth);
}
}
}
return authorizations;
}
Run Code Online (Sandbox Code Playgroud)
您可以替换Authorization任何类型的对象,但每次都是相同的模式.唯一的变量是对象类型和用于查询数据库的函数.
List<Authorization> ReadAuthorizations()
List<Login> ReadLogins()
List<Batch> ReadBatches()
// etc
Run Code Online (Sandbox Code Playgroud)
现在我觉得这只是为一个通用功能而尖叫,我想出了这个:
public List<T> Read<T>(Func<SqlConnection, SqlDataReader> func) where T : new()
{
List<T> objects = new List<T>();
using (SqlConnection connection = GetConnection(_ropsString))
{
using (SqlDataReader reader = func(connection))
{
while …Run Code Online (Sandbox Code Playgroud)