gpt4 book ai didi

c++ - make_unique 不编译

转载 作者:可可西里 更新时间:2023-11-01 16:28:49 29 4
gpt4 key购买 nike

我正在尝试为 std::unique_ptr 创建和使用 make_unique,就像 std::make_shared 存在于 std::shared_ptr described here .赫伯萨特 mentions make_unique 的可能实现如下所示:

template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args )
{
return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}

它似乎对我不起作用。我正在使用以下示例程序:

// testproject.cpp : Defines the entry point for the console application.
#include "stdafx.h"

#include <iostream>
#include <memory>
#include <utility>

struct A {
A(int&& n) { std::cout << "rvalue overload, n=" << n << "\n"; }
A(int& n) { std::cout << "lvalue overload, n=" << n << "\n"; }
};

template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args ) {
return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}

int main() {
std::unique_ptr<A> p1 = make_unique<A>(2); // rvalue
int i = 1;
std::unique_ptr<A> p2 = make_unique<A>(i); // lvalue
}

编译器(我使用的是 VS2010)给出了以下输出:

1>d:\projects\testproject\testproject\testproject.cpp(15): error C2143: syntax error : missing ',' before '...'
1>d:\projects\testproject\testproject\testproject.cpp(16): error C2065: 'Args' : undeclared identifier
1>d:\projects\testproject\testproject\testproject.cpp(16): error C2988: unrecognizable template declaration/definition
1>d:\projects\testproject\testproject\testproject.cpp(16): error C2059: syntax error : '...'
1>d:\projects\testproject\testproject\testproject.cpp(22): error C2143: syntax error : missing ';' before '{'
1>d:\projects\testproject\testproject\testproject.cpp(22): error C2447: '{' : missing function header (old-style formal list?)

此外,如果您将 make_unique 实现替换为以下内容

template<class T, class U>
std::unique_ptr<T> make_unique(U&& u) {
return std::unique_ptr<T>(new T(std::forward<U>(u)));
}

(取自 this 示例),它编译并工作正常。

谁能告诉我这是什么问题?在我看来,VS2010 在模板声明中遇到了一些 ... 问题,我不知道该怎么办。

最佳答案

Variadic 模板在 Visual C++ 11 的发布版本中不可用。但是,您可以使用针对不同数量参数的大量复制/粘贴代码来模拟参数扩展,或者使用 Microsoft 中使用的相同编译器技巧自己实现“伪变量”。来自 Herb Sutter 博客的评论:http://herbsutter.com/gotw/_102/#comment-6428

#include <memory> // brings in TEMPLATE macros.

#define _MAKE_UNIQUE(TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, X1, X2, X3, X4) \
\
template<class T COMMA LIST(_CLASS_TYPE)> \
inline std::unique_ptr<T> make_unique(LIST(_TYPE_REFREF_ARG)) \
{ \
return std::unique_ptr<T>(new T(LIST(_FORWARD_ARG))); \
}

_VARIADIC_EXPAND_0X(_MAKE_UNIQUE, , , , )
#undef _MAKE_UNIQUE

关于c++ - make_unique 不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13883824/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com