C++ 为什么不是';在这里工作时不使用“定义”来隐藏独特的丑?

C++ 为什么不是';在这里工作时不使用“定义”来隐藏独特的丑?,c++,visual-c++,c++11,visual-studio-2012,C++,Visual C++,C++11,Visual Studio 2012,以下隐藏独特丑陋的“伎俩”有什么错 class Drawable; typedef unique_ptr<Drawable> pDrawable; #define newDrawable(...) pDrawable(new Drawable (##__VA_ARGS__)) 与 我想翻译成: unique_ptr<Drawable> myDraw = unique_ptr<Drawable>(new Drawable()); unique_ptr myD

以下隐藏独特丑陋的“伎俩”有什么错

class Drawable;
typedef unique_ptr<Drawable> pDrawable;
#define newDrawable(...) pDrawable(new Drawable (##__VA_ARGS__))

我想翻译成:

unique_ptr<Drawable> myDraw = unique_ptr<Drawable>(new Drawable());
unique_ptr myDraw=unique_ptr(new Drawable());
但是,如果visual studio没有给出以下错误,我甚至无法编译宏。这就好像《定义》中的某些东西本身是不允许的。错误在我进行定义的行上返回,而不是在调用定义的行上返回

请参见此处,了解为什么make_unique不起作用:

edit2

我已经回答了下面的问题。上面的代码确实可以编译并工作。

嗯,
#define
是一个很大的问题,因为它不遵守范围规则,而且它们进行简单的文本替换,有时会产生令人惊讶的结果。我认为,当我需要完成某件事时,预处理器宏是最后的手段。 最好定义一个像
make_shared
这样的模板,它返回一个
唯一的\u ptr
。这是允许的,因为您可以将其移动到位

auto a_drawable = make_unique<Drawable>(a, b, c);

template <typename T, typename... Args>
::std::unique_ptr<T> make_unique(Args&&... args)
{
    return ::std::unique_ptr<T>{new T(::std::forward<Args>(args)...)};
}
auto a_drawable=make_unique(a、b、c);
模板
::std::unique_ptr make_unique(Args&&…Args)
{
return::std::unique_ptr{new T(::std::forward)

至于为什么在使用宏时会出现错误,我不确定。看起来你是在某个上下文中使用宏,结果会变成
const::std::unique\u ptr&
,然后尝试将其构造成不同的
pDrawable
。这行不通。我不知道为什么会发生这种情况。这是错误的epends在使用宏的上下文中起着至关重要的作用,但您没有提供这一点

这突出了我的第一点。宏非常难看的一个原因是,它们是简单的文本替换,其含义可以根据上下文而变化。

嗯,
#define
是一个巨大的问题,因为它不遵守范围规则,它们进行简单的文本替换,有时会产生令人惊讶的结果我认为当我需要完成某件事时,预处理器宏是最后的手段。

最好定义一个像
make_shared
这样的模板,该模板返回一个
唯一的\u ptr
。这是允许的,因为您可以将其移动到位

auto a_drawable = make_unique<Drawable>(a, b, c);

template <typename T, typename... Args>
::std::unique_ptr<T> make_unique(Args&&... args)
{
    return ::std::unique_ptr<T>{new T(::std::forward<Args>(args)...)};
}
auto a_drawable=make_unique(a、b、c);
模板
::std::unique_ptr make_unique(Args&&…Args)
{
return::std::unique_ptr{new T(::std::forward)

至于为什么在使用宏时会出现错误,我不确定。看起来你是在某个上下文中使用宏,结果会变成
const::std::unique\u ptr&
,然后尝试将其构造成不同的
pDrawable
。这行不通。我不知道为什么会发生这种情况。这是错误的epends在使用宏的上下文中起着至关重要的作用,但您没有提供这一点

这突出了我的第一点。宏非常难看的一个原因是,它们是简单的文本替换,其含义可以根据上下文而变化。

答案:

确保你实际使用了宏,一切都会好起来的

显然,为了验证#define宏,VC++会检查宏的实际使用情况。如果编译的宏没有实际使用情况,VC++会尝试“理解”它,并可能引发编译器错误

神奇的是,如果我加上:

pDrawable myDraw = newDrawable();
在上面的代码之后,错误消失了

很抱歉浪费了大家的时间。至少这激发了我阅读以下文章的灵感:

回答:

确保你实际使用了宏,一切都会好起来的

显然,为了验证#define宏,VC++会检查宏的实际使用情况。如果编译的宏没有实际使用情况,VC++会尝试“理解”它,并可能引发编译器错误

神奇的是,如果我加上:

pDrawable myDraw = newDrawable();
在上面的代码之后,错误消失了

很抱歉浪费了大家的时间。至少这激发了我阅读以下文章的灵感:



您实际如何使用
newDrawable()
在一个完整的声明中?你不会写你自己的
使_独一无二
?因为诚恳地说,这个宏更难看:/我怀疑你用它来代替
使_独一无二
,因为这是一个与
使_共享
类似的用例。Herb Sutter有一个使_独一无二的实现示例。这就是使_独一无二的原因如果他们记得将其包含在标准中,则为。请展示一个完整的示例来演示该问题。您实际如何使用
newDrawable()
在一个完整的声明中?你不会写你自己的
使_独一无二
?因为诚恳地说,这个宏更难看:/我怀疑你用它来代替
使_独一无二
,因为这是一个与
使_共享
类似的用例。Herb Sutter有一个使_独一无二的实现示例。这就是使_独一无二的原因如果他们记得将其包括在标准中的话,那就是。请给出一个完整的例子来说明这个问题。哦,我很高兴我提出了一个版本的
make_unique
几乎与Herb Sutter的版本完全相同,甚至不知道他的版本。这是一个如此简单和明显的功能,尽管这并不奇怪有趣的是,你们两个都忘了处理
char[]
@MooingDuck-Oops!笑吧,是的,我们都这么做了。人们分配数组并有一个
unique\u ptr
指向他们?!为什么,是谁干的?!chuckleI想不出一个理由也会使用标准的
make\u unique
。(人们可能需要C interop与malloc/free进行交互,但不能使用
使_唯一
。@MooingDuck-我也想不出原因。
unique_ptr
根本不支持
操作符[]
。因此真正有用的唯一数组句柄类型是
::std::vector
。是的,inter
auto a_drawable = make_unique<Drawable>(a, b, c);

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