小编Ser*_*eyA的帖子

在类中初始化字段的原因是什么?

在C++中,可以在类中初始化类的字段的值,如:

class X
{
  int a = 5;
}
Run Code Online (Sandbox Code Playgroud)

它是什么原因?它有用吗?默认的ctor完全相同.似乎我无法使用位掩码(int a : 3)初始化值.

c++ initialization class c++11

4
推荐指数
2
解决办法
1983
查看次数

类模板中的Typedef评估

下面的代码用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参数?哪个编译器是对的?

clang:http://coliru.stacked-crooked.com/a/fef7725827074e4f

gcc:http://coliru.stacked-crooked.com/a/79e17031fcabcd83

c++ templates typedef language-lawyer

4
推荐指数
1
解决办法
158
查看次数

模板别名范围

根据http://en.cppreference.com/w/cpp/language/type_alias,别名是块级声明.它没有说模板别名有什么特别之处,因此应该读取模板别名也是块级声明.

但是,在块级别上不可能使用模板别名.根据编译器的不同,错误是不同的 - 虽然g ++提供了一个有意义的消息,说在块范围内不允许模板,clang是完全神秘的.(例如:http://coliru.stacked-crooked.com/a/0f0862dad6f3da61).

到目前为止我遇到的问题:

  • cppreference是否未指定模板别名不能在块范围内使用?(或者我需要参加阅读课程吗?)
  • 编译器在块级别上是否正确拒绝模板别名(我觉得这个特性对于我的特定编码习惯非常有趣)
  • 如果第二个答案是肯定的,那么这可能是什么原因?为什么编译器会否认我这种纯语法糖?

c++ template-aliases

3
推荐指数
1
解决办法
575
查看次数

批处理文件以递归方式在 Windows 中列出目录,就像在 linux 中一样

我想创建一个批处理文件,该文件在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)

windows batch-file

3
推荐指数
1
解决办法
3562
查看次数

正在读取指向已删除内存的未定义行为吗?

考虑

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)

未定义.

c++

3
推荐指数
1
解决办法
168
查看次数

如何确定用fgets()读取的字符数?

这是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调用之后,有没有办法告诉输入有多长没有先初始化缓冲区?

谢谢.

c io stdio fgets

3
推荐指数
1
解决办法
2190
查看次数

缩短GCC错误消息

每当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)它们往往无法维护并停止使用下一个编译器升级

c++ gcc

3
推荐指数
1
解决办法
138
查看次数

如何以更有效的方式检查一个数是否为素数?

所以我有以下问题。他们给了我一个包含 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)

c++ primes

3
推荐指数
1
解决办法
2万
查看次数

可以使用整数索引访问向量元素吗?

我有一些整数变量和一个向量。我需要使用整数变量作为向量中的索引。

简单地说可以some_vector[some_integer]吗?

或者我是否需要以某种方式将整数转换为大小类型?

c++

3
推荐指数
1
解决办法
186
查看次数

模板化代码中的函数调用歧义

这是一个(非常精炼的)用例和代码示例(对不起,如果它看起来不是太小,我想不出还有什么要排除的。完整的“只是编译”代码可以在这里找到: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)

c++

3
推荐指数
1
解决办法
81
查看次数