我有一段代码如下所示.让我们说它在一个名为的文件中example.cpp
#include <fstream>
#include <string> // line added after edit for clarity
int main() {
std::string filename = "input.txt";
std::ifstream in(filename);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Windows上,如果我输入cmd命令g++ example.cpp,它将失败.这是一个很长的错误列表,我认为主要是由于链接器抱怨无法转换string为const char*.
但是如果我使用像这样的附加参数运行编译器:g++ -std=c++17 example.cpp它将编译并正常工作而没有任何问题.
当我运行前命令时会发生什么?我猜测C++编译器的默认版本标准被调用,但我不知道哪个?作为程序员/开发人员,我应该总是使用后一个命令和额外的参数吗?
请参阅此问题中有关实施模板的第一个答案.
具体来说,请注意这个引用
一个常见的解决方案是在头文件中编写模板声明,然后在实现文件(例如.tpp)中实现该类,并在头的末尾包含此实现文件.
我加粗了我最感兴趣的部分
..tpp文件的意义是什么?我尝试完全按照该页面中的建议进行操作.但后来,我将文件扩展名更改为任何随机乱码(如.zz或.ypp),它仍然有效!它应该工作吗?是否.tpp或任何其他扩展名是否重要?为什么不使用.cpp?
这是我很困惑的另一件事.
如果我的实现是用.cpp编写的,并且头文件定义了非模板化的函数,那么我只需要编译一次.cpp文件,对吧?至少在我改变.cpp文件中的内容之前.
但是,如果我有一个定义模板化函数的标题,并且我的实现是在一个带有随机时髦扩展的文件中,它是如何编译的?每次编译任何源代码#include的头部时,编译的实现是什么?
运行或调试任何东西给我一个非常令人沮丧的"启动失败.找不到二进制"错误.我正在使用安装了CDT插件的Eclipse(具体来说,我安装了MinGW软件包).
我已经尝试将用户和系统PATH变量都设置为包含my(MinGW目录)/ bin
我还尝试在运行之前构建程序.
我还确保启用了项目设置下的PE Windows Parser.
我去了Project Properties> Run/Debug Settings> New> C/C++ Application> Environment> Select>,然后我选择了Path
我还尝试将主选项卡中的C/C++应用程序设置为通过构建程序生成的可执行文件,但是在构建程序时没有生成这样的文件.不过,我严重怀疑这是导致问题的原因.
我的选项用完了,问题仍然存在.还有什么需要做的?我究竟做错了什么?
当我查看MinGW的安装说明时,本教程将mingw基本软件包引用为安装MinGW后要安装的软件包.但是mingw base不适合我.相反,我看到mingw32基地.可能是64位程序Eclipse试图运行32位代码吗?那是怎么回事?如果这是问题,我该如何解决?
我尝试在 VirtualBox 5.1.28 中运行 Arch Linux,其中主机操作系统是 Windows 10。问题是显示尺寸太小,即使我最大化窗口尺寸也是如此。查看此屏幕截图以了解我的意思:
我用谷歌搜索了这个问题,但我遇到的每个潜在解决方案都说要安装 Guest Additions,但正如您从上面的屏幕截图中看到的,我没有安装 Guest Additions 的选项。
假设我们有一个没有重载operator=()函数的类X.
class X {
int n;
X() {n = 0;}
X(int _n) {n = _n;}
};
int main() {
X a; // (1) an object gets constructed here
// more code...
a = X(7); // (2) another object gets constructed here (?)
// some more code...
a = X(12); // (3) yet another object constructed here (?)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否在(2)构造了一个新对象?如果是,那么在(1)构造的旧对象会发生什么?是自动销毁还是解除分配(这是它)?它被覆盖了吗?
又在(3)的代码中发生了什么?
最重要的是,是否有可能通过编写如上所述的代码来导致内存泄漏?
此问题已成功解决.我正在编辑我的帖子,以记录我的后代和未来参考的经验.
我有117个PDF文件(平均大小~238 KB)上传到Google云端硬盘.我想将它们全部转换为Google文档,并将它们保存在不同的Drive文件夹中.
我尝试使用Drive.Files.insert转换文件.但是,在大多数情况下,只有5个文件可以在函数过早失效之前以这种方式转换
限制超出:DriveApp.(行号,文件"代码")
上面引用的行insert是调用函数的位置.在第一次调用此函数后,后续调用通常会立即失败,而不会创建其他Google doc.
我用3种主要方法来实现我的目标.一个是使用Drive.Files.insert,如上所述.另外两个涉及使用Drive.Files.copy并发送一批HTTP请求.最后两种方法由Tanaike提出,我建议阅读下面的答案以获取更多信息.这些insert和copy功能来自Google Drive REST v2 API,而批处理多个HTTP请求来自Drive REST v3.
使用Drive.Files.insert,我遇到了处理执行限制的问题(在上面的问题部分中进行了解释).一种解决方案是多次运行这些功能.为此,我需要一种方法来跟踪转换的文件.我有两种选择:使用电子表格和延续令牌.因此,我有4种不同的方法来测试:本段中提到的两种方法,批处理HTTP请求,以及调用Drive.Files.copy.
由于团队驱动器的行为与常规驱动器不同,我觉得有必要两次尝试这些方法,其中一个包含PDF的文件夹是常规的非Team Drive文件夹,另一个文件夹在Team Drive下.总的来说,这意味着我有8种不同的测试方法.
这些是我使用的确切功能.其中每个都使用了两次,唯一的变化是源文件夹和目标文件夹的ID(由于上述原因):
function toDocs() {
var sheet = SpreadsheetApp.openById(/* spreadsheet id*/).getSheets()[0];
var range = sheet.getRange("A2:E118");
var table = range.getValues();
var len = table.length;
var resources = {
title: null, …Run Code Online (Sandbox Code Playgroud) import java.util.Random;
public class B {
private class C {
int[] data = new int[5];
C (int[] input) {data = input;}
void print() {
for (int i=0; i<5; i++)
System.out.print(data[i] + " " );
System.out.println();
}
}
C[] c;
B () {
Random r = new Random();
c = new C[5];
int[] t = new int[5];
for (int i=0; i<5; i++) {
for (int j=0; j<5; j++)
t[j] = r.nextInt(10) + 1;
c[i] = new C(t);
t = new int[5]; …Run Code Online (Sandbox Code Playgroud) Iterable<Position<Integer>> iterable = list.positions();
Iterator<Position<Integer>> iter = iterable.iterator();
while (iter.hasNext()) {
System.out.println(iter.next().getData());
}
Run Code Online (Sandbox Code Playgroud)
上面的代码没有问题.list只是我写的List类的一个实例.它包含Integer类型的元素.
for (Position<Integer> pos : iterable) {
}
Run Code Online (Sandbox Code Playgroud)
此代码在冒号后面的部分失败.这应该等同于第一段代码,即带有while循环的代码.所以我不明白为什么for-each循环有错误.错误说:"只能迭代数组或java.lang.Iterable的实例" - 但iterable已经是Iterable,不是吗?我在这里错过了什么?
以下是实现上述方法和类型的完整代码.
private class PositionIterator implements Iterator<Position<E>> {
private Position<E> cursor = first();
private Position<E> current = null;
public boolean hasNext() {
return cursor.getData() != null;
}
public Position<E> next() {
if (cursor == null) throw new NoSuchElementException("reached the end of the list");
current = cursor;
cursor = after(cursor);
return current;
}
} …Run Code Online (Sandbox Code Playgroud) 如果我使用new如下所示创建一个新的int数组对象:
int *array = new int[20];
Run Code Online (Sandbox Code Playgroud)
并使用一些整数填充数组,然后尝试使用for-each循环扫描该数组将给我一个错误:
for (int x : array) // error
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该如何解决?我尝试使用引用器和地址符号(*和&),但我尝试的每个组合都失败了.
恩.
for (int &x : *array) // does not work either.
Run Code Online (Sandbox Code Playgroud) 以前,我会将fstream对象的地址传递给执行I/O操作的任何函数,包括构造函数.但我想尝试将fstream对象作为成员变量使用,以便所有后续I/O操作都可以使用这些变量而不是将它们作为参数传递.
考虑以下Java程序:
public class A {
Scanner sc;
public A(Scanner read) {
sc = read;
}
}
Run Code Online (Sandbox Code Playgroud)
什么是C++相当于此?我试过这样做
class A {
ofstream *out;
public:
A (ofstream &output) {
out = output;
}
};
Run Code Online (Sandbox Code Playgroud)
但这给了我一个编译错误:
[错误]无效的用户定义从'std :: ofstream {aka std :: basic_ofstream}'转换为'std :: ofstream*{aka std :: basic_ofstream*}'[-fpermissive]