可变模板问题 [英] Variadic templates problem

查看:88
本文介绍了可变模板问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨!

我听说过Variadic模板,想要尝试一下。我写了这个小小的测试示例我想转发一个任意类的参数,其中构造函数的参数数量未知。大多数代码都是从不同的页面复制并放入这个例子。



我的问题是它根本不编译而且我不是真的了解问题所在。似乎编译器无法处理该函数的模板。我将代码下方的日志发布。



如果有人能够解决这个问题或者让我走上正轨,那就太棒了。

谢谢!



Hi!
I heard about Variadic templates and wanted to try them out. I wrote this little test example were I want to forward the arguments for an arbitrary class with an unknown number of arguments to the constructor. Most of the code is pretty much copied from different pages and put into this example.

My problem is that it doesn't compile at all and I don't really understand what the problem is. It seems like the compiler can't handle the template for the function. I post the log below the code.

If someone could figure this out or put me on the right track, that would be awesome.
Thank you!

4:#include "stdafx.h"
5:#include <iostream>
6:
7:using namespace std;
8:
9template<class T, class... Args>
10:T * create(Args&&... args)
11:{
12:	return new T(std::forward<Args>(args)...);
13:}
14:
15:class testClass
16:{
17:public:
18:	testClass(int a, double b)
19:	{
20:		cout << "c1" << endl;
21:	}
22:
23:	testClass(int& a, double& b, int c)
24:	{
25:		cout << "c2" << endl;
26:	}
27:
28:	~testClass() {}
29:};
30:
31:int _tmain(int argc, _TCHAR* argv[])
32:{
33:	testClass *t1 = create <testClass>(12, 1.0);
34:	testClass *t2 = create <testClass>(12, 1.0, 1234);
35:
36:	delete t2;
37:	delete t1;
38:	
39:	return 0;
40:}





构建错误日志:



Build error log:

1>------ Build started: Project: TestVariadicTemplates, Configuration: Debug Win32 ------
1>  TestVariadicTemplates.cpp
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(9): error C2332: 'class' : missing tag name
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(9): error C2993: '' : illegal type for non-type template parameter '<unnamed-tag>'
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(9): error C2143: syntax error : missing ',' before '...'
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(10): error C2065: 'Args' : undeclared identifier
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(10): error C2988: unrecognizable template declaration/definition
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(10): error C2059: syntax error : '...'
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(34): error C2065: 'testClass' : undeclared identifier
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(34): error C2065: 't1' : undeclared identifier
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(34): error C2065: 'create' : undeclared identifier
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(35): error C2065: 'testClass' : undeclared identifier
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(35): error C2065: 't2' : undeclared identifier
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(35): error C2065: 'create' : undeclared identifier
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(37): error C2065: 't2' : undeclared identifier
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(37): error C2541: 'delete' : cannot delete objects that are not pointers
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(38): error C2065: 't1' : undeclared identifier
1>e:\users\username\documents\visual studio 2012\projects\testvariadictemplates\testvariadictemplates\testvariadictemplates.cpp(38): error C2541: 'delete' : cannot delete objects that are not pointers
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

推荐答案

根据 http://msdn.microsoft.com/en-us/ library / vstudio / hh567368.aspx [ ^ ] visual studio仍然不支持Variadic模板。那就是问题所在。如果您需要这些功能,可以从microsoft下载Microsoft Visual C ++编译器2012年11月CTP。然而它是一个CTP版本,所以你可能不想发布你用它编译的软件。我希望今年即将发布的更新3中介绍了这些功能。我认为这个问题现在已经解决了。
According to http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx[^] visual studio still doesn't support Variadic templates. That's the problem. If you want those features you can download "Microsoft Visual C++ Compiler Nov 2012 CTP" from microsoft. It's however a CTP version so you probably don't wanna release your software compiled with it I guess. I hope those features are introduced in the coming update 3 this year. I consider the question solved now.


这篇关于可变模板问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆