我想知道C++标准对这样的代码的说法:
int* ptr = NULL;
int& ref = *ptr;
int* ptr2 = &ref;
Run Code Online (Sandbox Code Playgroud)
在实践中,结果是ptr2NULL,但我想知道,这只是一个实现细节还是在标准中明确定义?
在不同的情况下,取消引用NULL指针应该导致崩溃,但是在这里我取消引用它以获得由编译器作为指针实现的引用,因此实际上没有实际的解除引用NULL.
任何想法为什么我在我的MVC2项目中得到以下错误,即使在项目本身我肯定有一个参考"system.Web.Entity"?
Compiler Error Message: CS0234: The type or namespace name 'Entity' does not exist in the namespace 'System.Data' (are you missing an assembly reference?)
Source Error:
Line 1: <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<List<Node>>" %>
Line 2: <%@ Import Namespace="TopologyDAL" %>
Line 3: <%@ Import Namespace="System.Data.Entity" %>
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑 - 顺便说一句,如果我拿出第3行然后我得到错误:
Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler …Run Code Online (Sandbox Code Playgroud) 我正在从Java转向C++,并且对语言的灵活性感到有些困惑.有一点是存储对象的方法有三种:指针,引用和标量(如果我理解正确,则存储对象本身).
我倾向于尽可能使用引用,因为它尽可能接近Java.在某些情况下,例如派生属性的getter,这是不可能的:
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为t只存在于范围内,getSomeAttribute()并且如果我返回对它的引用,它将在客户端可以使用之前指出它.
因此,我有两个选择:
返回指针看起来像这样:
MyType *MyClass::getSomeAttribute() {
MyType *t = new MyType;
return t;
}
Run Code Online (Sandbox Code Playgroud)
这样做,但客户端必须检查此指针NULL才能确定,这是引用不必要的.另一个问题是调用者必须确保t解除分配,如果我可以避免它,我宁愿不处理它.
另一种方法是返回对象本身(标量):
MyType MyClass::getSomeAttribute() {
MyType t;
return t;
}
Run Code Online (Sandbox Code Playgroud)
这非常简单,正是我在这种情况下想要的东西:感觉就像一个引用,它不能为空.如果对象超出客户端代码的范围,则会将其删除.非常方便.但是,我很少看到有人这样做,这有什么原因吗?如果我返回标量而不是指针或引用,是否存在某种性能问题?
处理这个问题最常见/最优雅的方法是什么?
我有很久以前创建的这个DLL,用于连接我开发的特定软件的数据库.我已经有4年多没有问题和无数的应用程序与这个DLL.
尝试部署我的最新创建,我收到以下错误:
System.IO.FileNotFoundException: Could not load file or assembly '***.dll' or one of its dependencies. The specified module could not be found.
Run Code Online (Sandbox Code Playgroud)
因此,对于我写过的每个dll,我总是制作一个简单的表单应用程序来测试该DLL本身.运行这个简单的应用程序产生了同样的错误.该DLL不会加载或使用除以下内容之外的任何内容:System,System.Data,System.XML.因此,就它的依赖性而言,我没有看到任何错误.
顺便说一句,一切都在开发站工作.问题仅限于部署站..Net和必要的可再发行组件,因为我用C++完成所有工作,所以部署和工作.
运行FUSLOGVW.exe显示一切正常.
运行depends.exe说:警告:由于延迟加载相关模块中缺少导出功能,至少有一个模块具有未解析的导入.
我已经尝试重写整个事情了.这产生了相同的结果.
有线索吗?
EDITS
以下是总错误消息:
See the end of this message for details on invoking \"
just-in-time (JIT) debugging instead of this dialog box.\"
************** Exception Text **************\"
System.IO.FileNotFoundException: Could not load file or assembly 'connectionTo.dll' or one of its dependencies. The specified module could not be found.\"
File name: 'connectionToJobboss32.dll'\"
at TESTConnection.Form1.button1_Click(Object sender, EventArgs …Run Code Online (Sandbox Code Playgroud) 我正在尝试解决NuGet的Source Control限制.
为此,我需要更多地了解NuGet的工作原理.让我们举一个简单的例子.假设我有一个项目,我将AutoMapper添加到它.当我添加它应该放在哪里的dll?
我问,因为它似乎不一致.有时引用是在寻找"Packages"文件夹的dll:

有时它正在查看Debug构建输出文件夹:

但在这两种情况下,packages.config文件中的AutoMapper行都是相同的:
第一个例子:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AutoMapper" version="1.1.0.118" />
<package id="CommonServiceLocator" version="1.0" />
<package id="Unity" version="2.1.505.0" />
</packages>
Run Code Online (Sandbox Code Playgroud)
第二个例子:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="NSubstitute" version="1.1.0.0" />
<package id="AutoMapper" version="1.1.0.118" />
<package id="CommonServiceLocator" version="1.0" />
<package id="Unity" version="2.1.505.0" />
</packages>
Run Code Online (Sandbox Code Playgroud)
那么控制它建立引用的位置是什么?我如何才能使用包位置?(当它使用Debug输出文件夹时,如果您为"Release"编译,则这些引用会失败.)
沮丧的注意事项:我必须承认,我发现NuGet是一个很酷的主意,但除了简单的情况之外没有做好任何准备.(我正在考虑回到我的所有dll中都有一个lib文件夹.)
我不禁想知道我是否遗漏了一些东西,因为NuGet的广泛采用.必须有一些方法来完成这项工作......
也就是说,为什么这样:
struct S {};
struct T
{
T(S& s) : s{s} {}
S& s;
};
int main()
{
S s;
T t{s};
}
Run Code Online (Sandbox Code Playgroud)
给我一个GCC 4.7的编译器错误:
test.cpp: In constructor 'T::T(S&)':
test.cpp:5:18: error: invalid initialization of non-const reference of type 'S&' from an rvalue of type '<brace-enclosed initializer list>'
Run Code Online (Sandbox Code Playgroud)
?
要修复错误,我必须更改s{s}为s(s).这不会打破统一初始化的统一性吗?
编辑:我试过clang,clang接受它,所以也许这是一个GCC错误?
我正在尝试使用引用指针将值发送到函数中,但它给了我一个完全外来类型的错误
#include "stdafx.h"
#include <iostream>
using namespace std;
void test(float *&x){
*x = 1000;
}
int main(){
float nKByte = 100.0;
test(&nKByte);
cout << nKByte << " megabytes" << endl;
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
错误:对非const的引用的初始值必须是左值
我不知道我必须做些什么来修复上面的代码,有人能给我一些关于如何修复代码的想法吗?谢谢 :)
我刚刚对那些(相当)新功能进行了一些研究,我想知道为什么C++委员会决定为它们引入相同的语法?似乎开发人员不必浪费一些时间来理解它是如何工作的,并且一个解决方案让我们考虑进一步的问题.在我的情况下,它从问题开始,可以简化为:
#include <iostream>
template <typename T>
void f(T& a)
{
std::cout << "f(T& a) for lvalues\n";
}
template <typename T>
void f(T&& a)
{
std::cout << "f(T&& a) for rvalues\n";
}
int main()
{
int a;
f(a);
f(int());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我首先在VS2013上编译它,它按照我的预期工作,结果如下:
f(T& a) for lvalues
f(T&& a) for rvalues
Run Code Online (Sandbox Code Playgroud)
但有一个可疑的事情:intellisense强调了f(a).我做了一些研究,我明白这是因为类型崩溃(Scott Meyers将它命名为通用引用),所以我想知道g ++对它的看法.当然它没有编译.微软实现他们的编译器以更直观的方式工作是非常好的,但我不确定它是否符合标准,是否应该在IDE中存在这种差异(编译器与智能感知,但实际上可能存在在某种程度上是有道理的).好的,回到问题所在.我用这种方式解决了它:
template <typename T>
void f(T& a)
{
std::cout << "f(T& a) for lvalues\n";
}
template <typename T>
void f(const T&& a)
{
std::cout << "f(T&& a) for …Run Code Online (Sandbox Code Playgroud) 我正在使用Swift 2并使用WeakContainer作为存储一组弱对象的方式,就像 NSHashTable.weakObjectsHashTable()
struct WeakContainer<T: AnyObject> {
weak var value: T?
}
public protocol MyDelegate : AnyObject {
}
Run Code Online (Sandbox Code Playgroud)
然后在我的ViewController中,我声明
public var delegates = [WeakContainer<MyDelegate>]
Run Code Online (Sandbox Code Playgroud)
但这是错误的
使用MyDelegate作为符合协议AnyObject的具体类型不受支持
我看到的错误是,WeakContainer具有value声明为成员weak,因此T有望成为对象.但我也声明MyDelegate为AnyObject也.怎么解决这个问题?
我有几个与C++中引用的使用有关的问题.
在下面显示的代码中,它是如何工作的,而不是在线上给出错误q = "world";?
#include <iostream>
using namespace std;
int main()
{
char *p = "Hello";
char* &q = p;
cout <<p <<' '<<q <<"\n";
q = "World"; //Why is there no error on this line
cout <<p <<' '<<q <<"\n";
}
Run Code Online (Sandbox Code Playgroud)
如何将参考q重新初始化为其他内容?
不是字符串文字,p = "Hello"常量或只读空间?所以如果我们这样做,
q = "World";
Run Code Online (Sandbox Code Playgroud)
不会p改变应该是常量的字符串吗?
我已经阅读了有关C++引用类型变量的内容,因为它们无法重新初始化或重新分配,因为它们作为常量指针"内部"存储.所以编译器会给出错误.
但实际上如何重新分配参考变量呢?
int i;
int &j = i;
int k;
j = k; //This should be fine, but how we reassign to something else …Run Code Online (Sandbox Code Playgroud)