小编cod*_*ddy的帖子

使用extern模板(C++ 11)

图1:功能模板

TemplHeader.h

template<typename T>
void f();
Run Code Online (Sandbox Code Playgroud)

TemplCpp.cpp

template<typename T>
void f(){
   //...
}    
//explicit instantation
template void f<T>();
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
    f<char>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是正确的使用方法extern template,还是仅将此关键字用于类模板,如图2所示?

图2:类模板

TemplHeader.h

template<typename T>
class foo {
    T f();
};
Run Code Online (Sandbox Code Playgroud)

TemplCpp.cpp

template<typename T>
void foo<T>::f() {
    //...
}
//explicit instantation
template class foo<int>;
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

#include "TemplHeader.h"
extern template class foo<int>();
int main() {
    foo<int> test;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道将所有这些放在一个头文件中是好的,但如果我们在多个文件中实例化具有相同参数的模板,那么我们会得到多个相同的定义,编译器会将它们全部删除(除了一个)以避免错误.我该怎么用 …

c++ templates extern c++11

107
推荐指数
4
解决办法
8万
查看次数

如何正确释放新安置分配的内存?

我一直在阅读一下,当你使用placement new时,你必须手动调用析构函数.

考虑下面的代码:

   // Allocate memory ourself
char* pMemory = new char[ sizeof(MyClass)];

// Construct the object ourself
MyClass* pMyClass = new( pMemory ) MyClass();

// The destruction of object is our duty.
pMyClass->~MyClass();
Run Code Online (Sandbox Code Playgroud)

据我所知,运算符delete通常会调用析构函数然后释放内存,对吧?那么我们为什么不用delete呢?

delete pMyClass;  //what's wrong with that?
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我们被迫将pMyClass设置为nullptr在我们调用析构函数之后:

pMyClass->~MyClass();
pMyClass = nullptr;  // is that correct?
Run Code Online (Sandbox Code Playgroud)

但是析构函数没有释放内存,对吧? 这会是内存泄漏吗?

我很困惑,你能解释一下吗?

c++ placement-new

23
推荐指数
3
解决办法
6266
查看次数

初始化char*vs int*

这在C++中是可能的:

const char* ch = "hello";
Run Code Online (Sandbox Code Playgroud)

但是这样的事情是不可能的:

int* i = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

这两个char *chint* i是普通的指针.为什么可以char*分配多个字符而int*不能分配多个字符?

我知道我们可以使用

int x[] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

但这不是问题.

c++

19
推荐指数
1
解决办法
8702
查看次数

std :: valarray和std :: array之间有什么区别

valarray类的外观的同时,以array一流的,可以请你解释我在哪里,我宁愿valarrayarray反之亦然?

c++ valarray stdarray

14
推荐指数
3
解决办法
6448
查看次数

为什么typeid返回int和const int是相同的类型

if(typeid(int) == typeid(const int))
       cout << "Same types"<< endl;
Run Code Online (Sandbox Code Playgroud)

计划产出:

相同的类型

我错过了什么吗?这些是不同类型大声笑.

c++ typeid

13
推荐指数
2
解决办法
2644
查看次数

生成随机数(没有成员生成存在错误)

我正在尝试创建一个应该为我的轮盘程序实现一些方法的对象,但是在编译时我得到错误,std :: random_device中没有成员生成

这是一个类示例:

#include <random>
class Engine
{
public:
    Engine();

    int spin();
private:
    std::mt19937 m_generator;
    std::uniform_int_distribution<int> m_distribution;
    std::random_device m_seed;
};


Engine::Engine() :
    m_generator(m_seed),
    m_distribution(0, 36)
{
}

int Engine::spin()
{
    return m_distribution(m_generator);
}
Run Code Online (Sandbox Code Playgroud)

//现在让我们试一试

Engine eng;

for(int i = 0; i < 20; ++i)
    eng.spin();
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

上面的代码打开一个std头文件,代码不容易理解

c++ random c++11

10
推荐指数
1
解决办法
5540
查看次数

为什么我的64位机器上的双倍和长倍完全相同?

这个问题可能听起来像初学者,但是当我发现这个问题时,我认为我要么是初学者,要么我的作品缺少一些东西:

int main()
{
    cout << sizeof(double) << endl;
    cout << sizeof(long double) << endl;

    cout << DBL_DIG << endl;
    cout << LDBL_DIG << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

计划产出:

8

8

15

15

我认为long double是10个字节,有18个十进制数字,而double8个字节,有15个数字,但似乎我错了.

为什么会这样?

在64位机器上使用MSVC 2010.

c++ double long-double

9
推荐指数
1
解决办法
4314
查看次数

YouCompleteMe和Syntastic兼容性?

我想要做的是让YouCompleteMe做完成和Syntastic来检查错误,但它看起来不一致.

当YouCompleteMe被禁用时,Synatstic可以正常工作,反之亦然.但是当两者都启用时,完成不起作用,并且合成不会显示任何错误.

我需要什么配置来完成这项工作?

这是我的选择:(注意向下滚动以查看所有选项)

"
" YouCompleteMe options
"

let g:ycm_register_as_syntastic_checker = 1

"YCM will put icons in Vim's gutter on lines that have a diagnostic set.
"Turning this off will also turn off the YcmErrorLine and YcmWarningLine
"highlighting
let g:ycm_enable_diagnostic_signs = 1
let g:ycm_enable_diagnostic_highlighting = 0
let g:ycm_always_populate_location_list = 1 "default 0
let g:ycm_open_loclist_on_ycm_diags = 1 "default 1


let g:ycm_complete_in_strings = 1 "default 1
let g:ycm_collect_identifiers_from_tags_files = 1 "default 0
let g:ycm_path_to_python_interpreter = '' "default ''


let g:ycm_server_use_vim_stdout = …
Run Code Online (Sandbox Code Playgroud)

vim

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

检查运行时静态库或dll使用的是什么

Windows SDK中是否有一个工具可以阻止库使用什么CRT?例如,我有一个*.lib文件,如何检查是否使用/ MDd标志或/ MT进行编译?还有如何检查dll或exe相同?这可以用dumpbin完成吗?

windows winapi crt msvcrt dumpbin

9
推荐指数
1
解决办法
6740
查看次数

如何处理SIGABRT信号?

这是我为SIGABRT信号设置处理程序的代码,然后我调用abort()但处理程序没有被触发,而程序被中止,为什么?

#include <iostream>
#include <csignal>
using namespace std;
void Triger(int x)
{
    cout << "Function triger" << endl;
}

int main()
{
    signal(SIGABRT, Triger);
    abort();
    cin.ignore();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

计划产出:

在此输入图像描述

c++ signals

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