gpt4 book ai didi

c++ - 声明变量 C++、C++11 时自动使用无效

转载 作者:太空狗 更新时间:2023-10-29 19:51:15 27 4
gpt4 key购买 nike

每当我尝试编译我的代码时,我都会遇到 auto 的无效使用。来自 Java 背景,我不确定我是否完全理解 C++ 模板。编译器似乎可以推断类型。我仅限于 C++11。

错误发生在GeneralRenderer。

动物类

class Animal {};

class Dog : public Animal {};

class Cat : public Animal {};

enum AnimalType {
Dog,
Cat
};

渲染类

template<class T>
class AnimalRenderer {
virtual void draw(T entity) = 0;
};

class DogRenderer : public AnimalRenderer<Dog> {};


class CatRenderer : public AnimalRenderer<Cat> {};

逻辑

class GeneralRenderer {
public:
void draw(
std::map<AnimalType, std::vector<Animal>> animalMap) {

for (auto entry: animalMap) {
AnimalRenderer<auto> renderer; // <--- Causes the error
switch (entry.first) {
case Dog:
renderer = DogRenderer();
break;
case Cat:
renderer = CatRenderer();
break;
}

for (auto animal: entry.second) {
renderer.draw(entry);
}
}
};
};

最佳答案

非正式地说,auto可用于同时声明和初始化类型。然后编译器可以从用于初始化变量的值推断出类型。

但这里不是这种情况;像这样的声明

auto n;

同样会失败。

请注意 auto仅代表在编译时已知的类型。它的存在是为了使代码更具可读性,尽管它有时是强制性的,例如在使用 lambda 函数时。它不是变体类型的构造 cf。 std::variant比如说 C++17。

最后注意一个 std::mapjava.util.Map 完全不同. C++ 中没有类型删除 所以 std::map<A, B>是与 std::map<C, D> 根本不同的类型如果A是与 C 不同的类型和/或 B不同于 D .此外,C++ 允许您在映射中存储值类型。

关于c++ - 声明变量 C++、C++11 时自动使用无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50641354/

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