C++ template Day Day Up 第二天 模板参数推论(deduction)

西门子STEP7 V5.5安装调试指南:环境配置、授权激活与报错排查 在工业自动化领域,西门子PLC编程软件是设备维护与项目开发的核心工具。STEP7 V5.5作为经典S7-300/S7-400系列的控制程序组态环境,凭借其轻量高效、兼容老项目的特点,至今仍在产线维护和教学中广泛应用。软件安装看似简单,但系统环境不匹配、授权管理器异常、PG/PC接口配置错误等细节,常导致装完无法连接或程序不兼容。本文从操作系统兼容性、环境清理、组件选择入手,详细拆解STEP7 V5.5的完整安装流程,并针对“未找到有效许可密钥”、安装报错1642/1603等高频问题给出排查思路。最后结合PL 阅读详情
Today’s subject is Compile Argument Deduction.
 
我们平时用template的时候往往需要指定template argument type,实际上很多种情况可以不指定具体的类型,而依赖于编译器的deduction(个人推荐把这个单词翻译成推论,能表达出实际的行为,侯捷翻译这个单词为演绎,可能台湾这么说,总觉得怪怪的)。
先举一个小例子(refer to C++ Templates Chapter 2):
 
 
template <typename T> 
T 
const& Max (T const& a, T const& b)
{
  
return a > b? a : b;
}

看下面的调用:
[a] Max(1, 2);
[b] Max(‘c’, ‘d’);
[c] Max(5.5, 7);
[d] Max(5.5, static_cast<double>(7) );
[e] Max<double>(5.5, 7);
 
让我们先关注[a]、[b]、[c]
调用Max模板函数的时候并没有指定模板参数!这个就是编译器为我们所作的Argument Deduction。
编译器会根据传进去的变量推断出它的类型,[a]中compiler会生成Max<int>版本的函数,[b]则会生成Max<char>版本的函数。
那么[c]呢?
答案是compiler会报告一个错误,
VS2005中文版下:error C2782: “T Max(const T &,const T &)”: 模板参数“T”不明确
G++ :error: no matching function for call to `Max(double, int)'
请注意,Max函数的定义要求a和b是同一类型,也就是说compiler对于[c]推断不出匹配的函数。解决这个问题我们可以采用[d]或者[e]的方式调用Max函数。
 
另外,编译器对于类的成员函数也可以进行Deduction,看下面的例子:
class Any
{
public:
 
     template<typename T>
     Any(T const& ty)
     {
     }
};
 
这个Any类提供一个带模板的构造函数,编译器可以为这种成员函数进行类型推论,这会给这个类一种特别的威力。
int i = 5;
string s;
stack<string> st;
vector<int> v;
Any a = i;
Any b = s;
Any c = st;
Any d = v;
上面的代码竟然能够编译!
这会为C++带来什么,Any类是void*么?不是,Any类更像是java中的Object,它比void*强在它可以存储具体类型,当向下转换的时候,也更安全。
 
上面的说明可能您不太相信,建议看一下boost库的any的实现。文章的最后给出了我参考boost写的简略版的any的实现,代码忽略了很多细节,只突出重要思想(Boost是any,这里是Any),有兴趣可以看一下。
 
注意!只有函数或者成员函数才能够进行argument deduction。
 
Argument deduction还会为我们带来什么?
我比较欣赏的是编译期多态,Design Pattern的template版本会很有意思,以后的文章会介绍到。
Summary
写着写着就觉得稍微写深了,本来只想写函数模板,真是水平不济啊!
本人希望读这系列文章的读者能够熟悉C++非模板的语法和应用,并且最好能够熟悉面向对象(之后的文章可能会涉及一些Design Pattern),能写出真正的面向对象程序。
并且希望写作水平有所提高,可以在模板基础知识之间,穿插一些实际的应用,希望每一篇blog都会给不太了解模板的程序员一点帮助。
 
附录:
缩略版Any的实现
 
class Any
{
public:
    
class PlaceHolder
    
{
    
public:
        
virtual const std::type_info & type() const = 0;
    }
;

    template
<typename Ty>
    
class Holder
        :
public PlaceHolder
    
{
    
public:
        Holder(Ty 
const& data)
            :_data(data)
        
{
        }
;

        
virtual const std::type_info & type() const
        
{
            
return typeid(_data);
        }


    
public:
        Ty _data;
    }
;

public:

    Any()
        :_holder(
0)
    
{
    }


    template
<typename T>
    Any(T 
const& ty)
        :_holder(
new Holder<T>(ty))
    
{
        cout
<<"Con:"<<typeid(ty).name()<<endl;
    }


    template
<typename T>
    Any
& operator=(const T& rh)
    
{
        
if (!_holder)
        
{
            delete _holder;
        }


        cout
<<"Op=:"<<typeid(rh).name()<<endl;

        _holder 
= new Holder<T>(rh);
        
return *this;
    }


    
const std::type_info & type() const
    
{
        
return _holder ? _holder->type() : typeid(void);
    }


    
~Any()
    
{
        delete _holder;
    }


private:

    template
<typename ResultType>
    friend    ResultType
* Any_cast(Any* operand);

    PlaceHolder
* _holder;
}
;

template
<typename ResultType>
ResultType
* Any_cast(Any* operand)
{
    
return operand && (operand->type() == typeid(ResultType))
        
? &static_cast<Any::Holder<ResultType> *>(operand->_holder)->_data : 0;
}


main函数中:
    vector
<int> vo;
    vo.push_back(
1);
    vo.push_back(
2);
    Any a 
= 5;
    a 
= vo;

    vector
<int>* v = Any_cast<vector<int> >(&a);
    
for (vector<int>::iterator it = (*v).begin(); it != (*v).end(); ++it)
    
{
        cout
<<*it<<endl;
    }

 
 
c++参数包的实现 在开发过程中,在写一些回调函数的过程中,常常希望参数是不确定、可变的,这个时候我就希望能有一个参数包,各种参数都可以塞到参数包里面,然后将该参数包作为一个参数。之前一直使用tuple或结构体指针来实现该功能,但这两者在使用过程中还是有些不方便,于是就想自己写一个参数包的类。在boost库中有一个any类型,可作为参数包中参数的载体,可自行从boost中摘抄过来。我这边也提供一份代码:#ifndef... 阅读详情

相关推荐

C++学习(八十三)std的typeid 、type_info

vcruntiem_typeinfo.h class type_info { public: type_info(type_info const&) = delete; type_info& operator=(type_info const&) = delete; size_t hash_code() const throw() { return __std_type_info_hash(&_Data); } .

hankern的专栏 2452

Python的函数介绍

函数 概念: 在一个完整的项目中,某些功能可能会反复地使用,这时我们会将这些功能封装为函数,然后当我们使用的时候直接调用函数就行。 本质: 对功能的封装就是函数。 优点: 1.简化代码结构,增加了代码的重复使用的程度 2.修改、维护、调试方便 一、创建和调用函数 用法: ''' def(关键字) 函数名(): 函数体 return 返回表达式 函数名() #调用 ''' #函数名可以大小写字母...

weixin_45717984的博客 1196

Chapter 7 Linear Voltage Regulators

这一章我们介绍LDO.

2304_76736886的博客 2764

opencv4.9版本报错

解决办法更换4.6版。

蜗牛牛的博客 2070

ZLMediaKit在Windows下启用WebRtc编译(64位)

准备软件 cmake-gui vs2017 已经编译好的windows版本openssl(下载地址) 当然,你完全可以自己按照openssl的官网教程自己编译windows版本的openssl libsrtp编译安装 首先,需要将下载好的openssl解压并添加到环境变量。如下图,将下图路径添加到环境变量 其次,下载libsrtp(下载地址) 下载后解压并新建build文件夹,如下图: 在合适位置新建文件夹放置install后的srtp文件,如"D:\develop20..

byna11sina11的博客 1万+

ArduSub深度调参指南:如何让水下机器人像鱼一样稳定游动

本文深入探讨了ArduSub水下机器人的深度调参策略,旨在解决ROV在水下晃动、响应迟钝等问题。文章系统解析了级联PID控制逻辑,并针对静水与水流环境,提供了具体的深度保持与姿态控制调参方法、实战日志分析技巧以及异常振荡处理方案,帮助用户实现水下机器人稳定、流畅的游动性能。

CAT789的专栏 372

接上一主题,C++14中如何设计类似于std::any,使集合在C++中与Python一样支持任意数据?

C++: 上面一行代码中,有 char Array[], int, wchar_t Array[], 链表, Dobule 下面我们设计一个类 _any,它在构造函数如果是这样,上面语句就能编译过关。 上面最难的地方是在类_any内部中如何保存 tValue的值,如果把类声明为模板类,很容易解决,但是就要在每_any指定模板参数T,这样行不能? 用: std::shared_ptr吗? auto s = std::make_shared(tValue); 也不行,变量声

weixin_42944928的博客 574

手把手教你用TI MOSFET搭建0-100mA恒流源电路(附避坑指南)

本文详细介绍了如何使用TI MOSFET SI1204D搭建0-100mA恒流源电路,包括基础原理、电路设计、PCB布局和热管理技巧。通过分步指导和避坑指南,帮助工程师实现高精度、低成本的电流控制方案,适用于LED驱动、传感器激励等多种应用场景。

weixin_29310631的博客 484

任意类型容器Any

利用模板类继承非模板类,实现一个可以存储任意类型的容器 #ifndef _ANY_H #define _ANY_H #include <string> #include <algorithm> class IAnyItem abstract { public: virtual ~IAnyItem() {} virtual const type_info& ...

虹少侠的博客 763

SenseVoice 实测,阿里开源语音大模型,识别效果和效率优于 Whisper,居然还能检测掌声、笑声!5分钟带你部署体验

阿里开源语音大模型:语音识别效果和性能强于 Whisper,还能检测掌声、笑声、咳嗽等

u010522887的专栏 4万+

自相关互相关卷积的_相关性(Correlation)和相干性(Coherence)

1. 概念相关性(Correlation,或称相关系数或关联系数),显示两相关变量之间线性关系的强度和方向。在统计学中,相关的意义是用来衡量两个变量相对于其相互独立的距离。相干性(Coherence),与相关性计算得到的信息非常相似,都是衡量两个变量之间的相关程度,只是相干性多用于频域计算,可以在基于频率上给出更多的信息,而相关性多用于普通的数组计算和时域信号。这里其实应该有三个概念,c...

weixin_39963053的博客 3332

c++实现反射功能

这是一个无入侵的,并且带有反射代码生成工具的开源库。程序员一般都很懒,能自动实现的一般不想逐行敲代码,我们需要一个自动生成反射代码的工具,在这个开源库中,提供了一种基于llvm+clang进行代码生成的工具,在我们程序代码中只需要把需要反射的成员、函数打上下面的标记,利用反射工具就可以自动生成代码。反射工具会分析头文件,由于反射工具的REF_EXPORT_FLAG宏是生效的, 因此它看到标记了需要反射的成员前面都会多出了一个特殊的struct,基于此就可以把需要反射的信息提取出来,并生成我们需要的代码。

itnkcong的博客 2850

halcon与QT联合:(5.1)瓶盖检测以及QT界面搭建

halcon实现瓶盖检测与定位代码: dev_close_window() dev_open_window(0, 0, 1024, 1024, 'black', WindowHandle) list_image_files('C:/Users/TIMI/Desktop/picture/circle', 'default', [], ImageFiles) for J := 1 to 4 by 1 *read image read_image(halconImage, ImageFil

m0_37957160的博客 1044

RTTI和CAST

什么是RTTI?

ranxirui8580的博客 169

2023年美高赛HiMCM:A题蒲公英 思路

蒲公英,通常称为蒲公英,是一种原产于欧亚大陆的植物,现在在世界各地都可以找到[1]。这种植物很容易通过其亮黄色的花朵(图1)和独特的“马勃”种子头(图2)来识别。该头部的每颗种子都附着在一个类似降落伞的结构上,称为“冠毛”,有利于风的传播[2]。如果处于“马勃”阶段的单个蒲公英毗邻一块开阔的一公顷土地,请创建一个数学模型来预测蒲公英在 1、2、3、6 和 12个月内的传播情况。确保您的模型考虑了各种气候条件(例如温带、干旱和热带气候)对蒲公英生长的影响。2. 蒲 公英、人类和其他植物之间的关系很复杂。

斌擎科技 7403

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【项目三】C++实现事件委托

前几天在学习设计模式中的观察者模式时发现需要用到一个十分巧妙的机制——事件委托,事件委托的匿名属性,可以使得通知者对象更新观察者对象时不需要依赖具体名称的函数,是一种降低系统耦合度的设计。我看的设计模式书是《大话设计模式》,里面使用C#举例的,C#中就有事件委托的机制,而我是学C++,无奈C++中没有事件委托的设计,虽然Qt中有类似的机制——信号与槽,但是总感觉技术不如掌握在自己手中好,索性自己了解并编写一套事件委托系统

学艺不精的Anton的博客 1409

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++实现委托机制(二)

上一篇文章已经介绍了如何构建一个无参数无返回值的函数指针的委托,这篇文章将对上一文章所述委托进行扩展,使得可以注册任意函数指针,不过再讲篇内容之前先要介绍一下实现这个功能所需要了解的C++11的一个新特性———可变参数模板。

YzlCoder的记事本 8182

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

现代C++之理解模板类型推断(template type deduction)

现代C++之理解模板类型推断(template type deduction) 理解模板类型推断(template type deduction) 我们往往不能理解一个复杂的系统是如何运作的,但是却知道这个系统能够做什么。C++的模板类型推断便是如此,把参数传递到模板函数往往能让程序员得到满意的结果,但是却不能够比较清晰的描述其中的推断过程。模板类型推断是现代C++中被广泛使用的关键字auto...

HarlanC的专栏 956

C++ 九阴真经之任意值

any是一个可用于任何类型单个值的类型安全的容器,目前已收录到C++17标准库,但对于一些历史 项目,可能并没有使用最新编译器,那么可以自己简单的实现。 代码实现: #include <assert.h> #include <typeinfo> #include <string> class AnyVar { public: //保存真正数据的接口类 class placeholder { public: virtual ~placeholder

零落年华的专栏 287

Template Type Deduction

C++模板类型推导 对于如下的C++模板类型推导 template<typename T> void f(ParamType param); f(expr);// 根据expr推导T和ParamType 要分三钟情况: Case 1 ParamType是引用或指针,且不是Universal Reference 首先,如果expr是引用类型,则C++模板类型推导时会忽略参数expr的reference-ness。 然后,对ParamType的推导决定对T的推导 正常情况下,expr的cons

weixin_43313321的博客 285

【C++】模板参数推导(template argument deduction)

    Table of Contents 1 模板参数推导在迭代器中的使用 2 模板参数引用与非引用的区别 1 模板参数推导在迭代器中的使用 在算法中运用迭代器时,可能会用到其相应类型(associative type),即迭代器所指向对象的类别。但C++只支持sizeof(),并不存在typeof()之说(即使运用RTTI性质中的ty...

weixin_34082854的博客 346

从零开始写STL—模板元编程之any

any class any; (since C++17) The class any describes a type-safe container for single values of any type. (1) An object of class any stores an instance of any type that satisfies the constructo...

aocan6909的博客 292

常见错误总结

1、error C2275: “XXX”: 将此类型用作表达式非法 在移植c++代码到c的时候,经常会出现一个奇怪的错误, error C2275: “XXX”: 将此类型用作表达式非法, 这个错误是由于c的编译器要求将变量的声明放在所有函数调用语句之前,而c++没有这样的要求造成的。  解决的办法就是把变量的声明全部放在变量的生存块的开始。  2、error C2780: “c

xdx2ct1314的专栏 911

strcpy用于调用的参数太少_C++ 11新特性 1. Variadic Templates 可变数量的模板参数

关键字"...":...:代表可以接受任意变化个数的东西。个数随意。每一个的类型也随意。...:就是一个所谓的pack(包)用于template parameters,就是template parameters pack(模板参数包)。用于function parameters types,就是function parameter type pack(函数参数类型包)。用于function par...

weixin_39631632的博客 938
上一篇: C++ template Day Day Up 第一天 模板编译模式
下一篇: C++ template Day Day Up 第三天 模板函数的重载
firectrl
博客等级 码龄20年 4粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值