以下C++测试代码没有链接(gcc 4.9.2,binutils 2.25).错误是In function 'main': undefined reference to 'X::test'.
01: #include <string>
02: #include <iostream>
03:
04: namespace X
05: {
06: extern std::string test;
07: };
08:
09: using namespace X;
10: std::string test = "Test";
11:
12: int main()
13: {
14: std::cout << X::test << std::endl;
15: }
Run Code Online (Sandbox Code Playgroud)
由于第09行,我期待第10行定义X::test在第06行声明的变量.我相信test在全局命名空间中声明和定义了一个不相关的变量,因此链接错误.
问题:有人可以解释为什么我的期望不正确,究竟发生了什么?
不是答案:
std::string X::test = "Test";.我正在尝试使用anugularJS生成一个n级分层无序列表,并且已经能够成功完成.但是现在,我在指令和控制器之间存在范围问题.我需要在指令模板中通过ng-click调用的函数中更改父类的scope属性.
请参阅http://jsfiddle.net/ahonaker/ADukg/2046/ - 这是JS
var app = angular.module('myApp', []);
//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});
function MyCtrl($scope) {
$scope.itemselected = "None";
$scope.organizations = {
"_id": "SEC Power Generation",
"Entity": "OPUNITS",
"EntityIDAttribute": "OPUNIT_SEQ_ID",
"EntityID": 2,
"descendants": ["Eastern Conf Business Unit", "Western Conf Business Unit", "Atlanta", "Sewanee"],
children: [{
"_id": "Eastern Conf Business Unit",
"Entity": "",
"EntityIDAttribute": "",
"EntityID": null,
"parent": "SEC Power Generation",
"descendants": ["Lexington", "Columbia", "Knoxville", "Nashville"],
children: [{
"_id": "Lexington",
"Entity": "OPUNITS",
"EntityIDAttribute": "OPUNIT_SEQ_ID",
"EntityID": 10,
"parent": "Eastern …Run Code Online (Sandbox Code Playgroud) 为什么Visual Studio 2008会自动将以下using指令插入到我创建的每个新C#文件中?
using System;
using System.Collections.Generic;
using System.Text;
Run Code Online (Sandbox Code Playgroud)
这些命名空间有什么特别之处?这些是最常用的吗?
这个问题可能重复,但我找不到一个好的答案.简短而简单,需要我申报
using namespace std;
Run Code Online (Sandbox Code Playgroud)
在C++程序中?
有令人信服的论据反对 using namespace std,为什么它被引入语言呢?不using namespace破坏命名空间的目的吗?我为什么要写using namespace?是否有任何问题我不知道这是通过优雅地解决using namespace,也许是在using std::swap成语或类似的东西?
我尝试编译C#程序时出现以下错误:
The type or namespace name 'Login' could not be found (are you missing a using directive or an assembly reference?)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FootballLeague
{
public partial class MainMenu : Form
{
FootballLeagueDatabase footballLeagueDatabase;
Game game;
Team team;
Login login; //Error here
public MainMenu()
{
InitializeComponent();
changePanel(1);
}
public MainMenu(FootballLeagueDatabase footballLeagueDatabaseIn)
{
InitializeComponent();
footballLeagueDatabase = footballLeagueDatabaseIn;
}
private void Form_Loaded(object sender, EventArgs e)
{
} …Run Code Online (Sandbox Code Playgroud) 已经确定的调用习惯swap是:
using std::swap
swap(foo, bar);
Run Code Online (Sandbox Code Playgroud)
这样,swap可以为std命名空间之外的用户定义类型重载.
我们应该调用begin,并end以同样的方式?
using std::begin;
using std::end;
some_algorithm(begin(some_container), end(some_container));
Run Code Online (Sandbox Code Playgroud)
或者我们应该写:
some_algorithm(std::begin(some_container), std::end(some_container));
Run Code Online (Sandbox Code Playgroud) 在C#中,有三种使用指令:
using System; // Specify Namespace
using Diag = System.Diagnostics; // Specify Namespace Alias
using DBG = System.Diagnostics.Debug; // Specify Class Alias
Run Code Online (Sandbox Code Playgroud)
在C++/CLI中,我知道前两个的等价物:
using namespace System;
namespace Diag = System::Diagnostics;
Run Code Online (Sandbox Code Playgroud)
有没有办法在C++/CLI中做第三个?
做的namespace DBG = System::Diagnostics::Debug;给error C2879: 'System::Diagnostics::Debug' : only an existing namespace can be given an alternative name by a namespace alias definition
我提出的唯一的交替是#define DBG System::Diagnostics::Debug,但我更喜欢正确的使用指令,如果可用的话.
我正在编写一个系统来处理作为Noda Time的单元测试编写的片段,因此我可以在文档中包含这些片段.我有第一次通过工作,但我想整理代码.处理代码片段时需要做的一件事就是using确定该代码段实际需要哪些指令.(单个源文件中可能有多个片段,但每个片段将单独出现在文档中 - 我不希望从一个片段导入影响另一个片段.)
该工作与代码的交易Document情况-我创建一个单独的Document包含单一方法,所有潜在的进口量平均片段,将其添加到项目中,然后删除不必要using这样的指令:
private async static Task<Document> RemoveUnusedImportsAsync(Document document)
{
var compilation = await document.Project.GetCompilationAsync();
var tree = await document.GetSyntaxTreeAsync();
var root = tree.GetRoot();
var unusedImportNodes = compilation.GetDiagnostics()
.Where(d => d.Id == "CS8019")
.Where(d => d.Location?.SourceTree == tree)
.Select(d => root.FindNode(d.Location.SourceSpan))
.ToList();
return document.WithSyntaxRoot(
root.RemoveNodes(unusedImportNodes, SyntaxRemoveOptions.KeepNoTrivia));
}
Run Code Online (Sandbox Code Playgroud)
因为我已经知道我可以使用IOrganizeImportsService同一个文档工作时,但我喜欢到只是把它写的Script,因为那种感觉以各种方式更清洁.
创建脚本很简单,所以我想分析一下未使用的导入(在一些早期的清理步骤之后).这是我希望用于脚本的代码:
private static Script RemoveUnusedImports(Script script)
{
var compilation = …Run Code Online (Sandbox Code Playgroud) 有时候我会找到类似下面的代码(实际上有些类向导会创建这样的代码):
// C.h
namespace NS {
class C {
void f();
};
}
Run Code Online (Sandbox Code Playgroud)
并在实现文件中:
// C.cpp
#include "C.h"
using namespace NS;
void C::f() {
//...
}
Run Code Online (Sandbox Code Playgroud)
我试过的所有编译器都接受那种代码(gcc,clang,msvc,compileonline.com).是什么让我感到不舒服的是using namespace NS;.从我的观点来看,C::f()生活在全局命名空间中的环境中,该环境对生活在命名空间NS中的对象具有不合格的访问权限.但是在编译器的观点中void C::f()存在namespace NS.正如我尝试的所有编译器都分享了这一观点,他们可能是正确的,但是标准中的这个意见得到了支持?