【问题标题】:How do i use 'auto' in C++ (C++0x)?如何在 C++ (C++0x) 中使用“自动”?
【发布时间】:2010-05-27 21:02:46
【问题描述】:

我必须对这段代码做些什么才能让它编译,它正在这条线附近刹车:

auto val = what.getObject();

#include<iostream>
using namespace std;

class CUP{
    public:
        void whatsHappening(){}
};

class MUG{
    public:
        void whatsHappening(){}
};

class CupThrower{
    public:
        CUP cp;
        CUP getObject(){ return cp;}
};

class MugThrower{
    public:
        MUG mg;
        MUG getObject(){return mg;}
};

template <typename T> void whatsHappening(T what){

    auto val = what.getObject(); //DOES NOT COMPILE
    val.whatsHappening();
}

int main(){
    CupThrower ct;
    MugThrower mt;
    whatsHappening(ct);
    whatsHappening(mt);
    return 0;
}

我是用VS2008编译的。

【问题讨论】:

  • 发布您遇到的实际错误会很有帮助。另外,你用的是什么编译器?
  • 我用的是VS2008,错误太长无法贴出来
  • VS2008 不支持auto,移到 VS2010 或 GCC 4.4/4.5。
  • @Brian:由于 auto 关键字的原始含义已经几十年没有使用过了,下一个 C++ 标准将对其进行回收,赋予它新的含义。如果你碰巧知道 C# 中的 var - 那将是 C++ 中的 auto
  • @Brian:引入新关键字总是会破坏某些人的代码。 OTOH,我无法想象会有使用 auto 在其原始(和冗余)中的代码,这意味着有人实际上想要使用下一代 C++ 编译器进行编译。大约十年前,我第一次看到在 c.l.c++.m 中建议重新定义 auto,从那以后看到了很多讨论,并且从未听说过有人声称如果这样做他们的代码会中断。你能推荐任何具有该特征的新关键字吗?

标签: c++ templates c++11 visual-c++-2008


【解决方案1】:

VS2008 不支持自动。使用 VS2010 及更高版本,或其他支持此功能的编译器。

【讨论】:

  • 这是编译版本,我没有 vs2010 但我尝试使用 gcc 4.4* 并且它有效。感谢您的提示。
【解决方案2】:

其他人说auto 不在 VC9 中,这是真的。 auto 在当前的 C++ 标准中并不意味着它在 C++0x 中的含义。在当前的标准中,它实际上没有任何用处。长话短说,您不能像在此处尝试使用的那样使用auto

但是还有一个选择。在这段代码中:

template <typename T> void whatsHappening(T what){

    auto val = what.getObject(); //DOES NOT COMPILE
    val.whatsHappening();
}

...您遇到的问题是val 的类型未知。如果TCupThrower,那么getObject() 返回一个CUP。同样,对于MugThrowergetObject() 返回一个MUG。您的代码编写方式,您无法仅根据T 的类型知道getObject() 返回的类型。所以解决的办法就是添加一个知道它的方法。试试这个:

class CupThrower{
    public:
        typedef CUP ObjectType;
        ObjectType cp;
        ObjectType getObject(){ return cp;}
};

class MugThrower{
    public:
        typedef MUG ObjectType;
        ObjectType mg;
        ObjectType getObject(){return mg;}
};

现在getObject() 返回的类型是封闭类的一部分。您可以更改 whatsHappening() 函数以使用此信息:

template <typename T> void whatsHappening(T what){

    T::ObjectType val = what.getObject(); //DOES COMPILE!
    val.whatsHappening();
}

世界再次一切正常。

【讨论】:

  • 这很好,但我正在尝试学习如何在 c++0x 中使用隐式类型变量,这并不能回答我的问题。
  • 你需要把它改成typename T::ObjectType val = ...
【解决方案3】:

Auto 是仅存在于 C++0x 中的功能,因此在大多数(如果不是全部)编译器中默认情况下不启用。您是否在编译器中使用了适当的选项来启用它?

【讨论】:

  • 我正在使用 Visual Studio 2008 进行编译,我必须启用什么才能使其工作?
  • @Loud:您必须启用“升级到 Visual Studio 2010”:-)
  • 实际上,没有。 Auto 在 C 标准中可用(因此我很确定 C++)唯一的事情是它完全没有做任何事情。它将局部变量定义为具有局部范围......嗯......是吗?
  • @Brian:由于 auto 在其原始形式的关键字中已经几十年没有出现在野外,下一个 C++ 标准重新定义了它的含义。
【解决方案4】:

它无法编译,因为您正在尝试处理大小为零的非函数对象。

编辑: 在 VS2010 中对我来说效果很好。

【讨论】:

  • 我不太清楚你的意思。
  • 我也不是,但我很确定这不是您的代码无法编译的原因。
  • DeadMG 在进行过程中制造了这种东西 - 忽略。
  • @John,这根本不是原因。哎呀,在标准 C++ 中甚至不可能有一个大小为零的对象。
  • 我们中的一个人至少尝试过发布一个有用的建议。我们中的一个人刚刚被拖了。
猜你喜欢
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
相关资源
最近更新 更多