在C++中,可以在类中初始化类的字段的值,如:
class X
{
int a = 5;
}
Run Code Online (Sandbox Code Playgroud)
它是什么原因?它有用吗?默认的ctor完全相同.似乎我无法使用位掩码(int a : 3)初始化值.
下面的代码用g ++编译,但无法用clang编译.
struct X;
template <typename T>
struct Traits
{
typedef typename Traits<T>::Container Container;
};
template <>
struct Traits<X>
{
typedef std::vector<X *> Container;
};
int main()
{
Traits<X>::Container container;
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
clang错误信息:
main.cpp:9:30: error: no type named 'Container' in 'Traits<T>'
Run Code Online (Sandbox Code Playgroud)
编译器是否应该评估typedef而不用实际类型替换template参数?哪个编译器是对的?
根据http://en.cppreference.com/w/cpp/language/type_alias,别名是块级声明.它没有说模板别名有什么特别之处,因此应该读取模板别名也是块级声明.
但是,在块级别上不可能使用模板别名.根据编译器的不同,错误是不同的 - 虽然g ++提供了一个有意义的消息,说在块范围内不允许模板,clang是完全神秘的.(例如:http://coliru.stacked-crooked.com/a/0f0862dad6f3da61).
到目前为止我遇到的问题:
我想创建一个批处理文件,该文件在Windows中以类似 linux 的格式递归列出目录。例如,考虑以下批处理文件:
@echo off
tree /f /a C:\Windows\Boot\dvd>%userprofile%\desktop\tree_output.txt
exit
Run Code Online (Sandbox Code Playgroud)
此批处理文件将 tree 命令的输出回显或保存在用户桌面文件夹中名为 tree_output.txt 的文本文件中(/f 参数也列出子目录中的所有文件,/a 参数以 ASCII 格式显示 tree 命令的输出文本格式而不是图形格式)。tree_output.txt 包含以下输出:
Folder PATH listing for volume System
Volume serial number is 4E00004E 545D:650E
C:\WINDOWS\BOOT\DVD
+---EFI
| | BCD
| | boot.sdi
| |
| \---en-US
| efisys.bin
| efisys_noprompt.bin
|
\---PCAT
| BCD
| boot.sdi
| etfsboot.com
|
\---en-US
| bootfix.bin
Run Code Online (Sandbox Code Playgroud)
但是,linux 中的ls -R命令会像这样递归地列出目录:
C:\WINDOWS\BOOT\DVD\
C:\WINDOWS\BOOT\DVD\EFI
C:\WINDOWS\BOOT\DVD\EFI\BCD
C:\WINDOWS\BOOT\DVD\EFI\boot.sdi
C:\WINDOWS\BOOT\DVD\EFI\en-US
C:\WINDOWS\BOOT\DVD\EFI\en-US\efisys_noprompt.bin
C:\WINDOWS\BOOT\DVD\PCAT
C:\WINDOWS\BOOT\DVD\PCAT\BCD
C:\WINDOWS\BOOT\DVD\PCAT\boot.sdi …Run Code Online (Sandbox Code Playgroud) 考虑
Foo* f = new Foo();
delete f;
Foo* g = f;
Run Code Online (Sandbox Code Playgroud)
由于我读到了一个我不拥有的内存指针,最终语句现在是不确定的吗?对我而言,它违反了一个过去的结束规则,所以它应该是.
注意
Foo* f;
Foo* g = f;
Run Code Online (Sandbox Code Playgroud)
未定义.
这是fgets()从手册页的描述:
char *fgets(char *s, int size, FILE *stream);
...
RETURN VALUE
fgets() returns s on success, and NULL on error or when end of file
occurs while no characters have been read.
Run Code Online (Sandbox Code Playgroud)
它不遵循模式read,在失败时返回-1,在成功时返回读取的字节数.相反,它返回char*它NULL的失败和s成功.这没有给我任何关于输入多长时间的信息.所以,如果我有这样的事情:
char input_buffer[256];
fgets(input_buffer, sizeof(input_buffer), stdin);
Run Code Online (Sandbox Code Playgroud)
在fgets调用之后,有没有办法告诉输入有多长没有先初始化缓冲区?
谢谢.
每当gcc找不到具有多个重载的函数的匹配重载时,它就会给出错误的行和行,解释尝试了哪个重载以及为什么不使用它.
虽然它通常是有用的,但它通常也不是,因为问题只是呼叫站点的简单错字.在这种特殊情况下,它甚至没有帮助,因为甚至需要花费相当长的时间来找出哪一行最终导致了这个问题.
是否有任何命令行切换到GCC以缩短输出并且仅包括实际的触发线?例如:
#include <string>
#include <iostream>
struct Z{};
void foo() {
std::string s;
Z z;
std::cout << z; // typo - meant s
}
Run Code Online (Sandbox Code Playgroud)
请参阅错误输出:https://godbolt.org/g/wz5vL2
小额补充:第三方解决方案(STLFilt,gccfilter等)不适合这项法案,因为a)我的工作环境不欢迎安装第三方应用程序,b)它们往往无法维护并停止使用下一个编译器升级
所以我有以下问题。他们给了我一个包含 n 个数字的数组,我必须使用“Divide et Impera”打印它是否包含任何素数。我解决了这个问题,但只得到了 70/100,因为它效率不高(他们说)。
#include <iostream>
using namespace std;
bool isPrime(int x){
if(x == 2) return false;
for(int i = 2; i <= x/2; ++i)
if(x%i==0) return false;
return true;
}
int existaP(int a[], int li, int ls){
if(li==ls)
if(isPrime(a[li]) == true) return 1;
else return 0;
else return existaP(a, li, (li+ls)/2)+existaP(a, (li+ls)/2+1, ls);
}
int main(){
int n, a[10001];
cin >> n;
for(int i = 1; i<=n; ++i) cin >> a[i];
if(existaP(a,1,n) >= 1) cout << "Y"; …Run Code Online (Sandbox Code Playgroud) 我有一些整数变量和一个向量。我需要使用整数变量作为向量中的索引。
简单地说可以some_vector[some_integer]吗?
或者我是否需要以某种方式将整数转换为大小类型?
这是一个(非常精炼的)用例和代码示例(对不起,如果它看起来不是太小,我想不出还有什么要排除的。完整的“只是编译”代码可以在这里找到:https:// gcc.godbolt.org/z/5GMEGKG7T )
我想要一个“特殊”的输出流,对于某些用户类型,它在流处理过程中进行特殊处理。
这个特殊的流应该能够通过“特殊”处理来传输“特殊”类型,以及可以通过常规流传输的任何其他类型——在后一种情况下,我们直接使用常规流
struct Type { }; // Special type
struct Stream { // Special stream
// In this distilled example, we could achieve the same result
// by overriding << for ostream and Type, but the actual use case is wider
// and requires usage of the special stream type
// For illustration purposes only, we use this overload to cout "T!" for Types
Stream& stream(Type t) { std::cout << "T!"; return *this;}
// For any …Run Code Online (Sandbox Code Playgroud)