所以我为了我的目的遵循了这个SO 答案,我真的不知道如何解决这个错误。当我尝试访问audioType[wav]or 时audioType[mp3],出现以下错误。查找互联网对我没有帮助。
error: no viable overloaded operator[] for type 'const std::map<AudioTypes, const char *>
note: candidate function not viable: 'this' argument has type 'const
std::map<AudioTypes, const char *>', but method is not marked const
mapped_type& operator[](const key_type& __k);
// WAVFile.h
class WAVFile {
// ...
private:
enum AudioTypes: int;
static std::map<AudioTypes, const char*> audioType;
// ...
}
// WAVFile.cpp
enum AudioTypes: int {
wav,
mp3
};
static map<AudioTypes, const char*> audioType = { …Run Code Online (Sandbox Code Playgroud) 我最近惊讶地发现这段代码可以编译(至少在 gcc 和 MSVC++ 上):
template<typename T>
class A {
public:
T getT() { return T(); }
};
class B : public A<B> { };
Run Code Online (Sandbox Code Playgroud)
当这没有发生时:
class A;
class B : public A { };
class A {
public:
B getB() { return B(); }
};
Run Code Online (Sandbox Code Playgroud)
对我来说,模板类可以采用不完整的类型作为模板参数,并且有一个函数通过调用其构造函数返回一个类型,并且仍然可以编译,这对我来说似乎很奇怪。那么到底哪里需要完整的类型(或者如果列表更短,哪里不需要它们)?
我检查了SO的重复,但无法找到我的问题的确切解决方案.
我有一个头文件NvCommon.h,我使用枚举NV_DATA_TYPE.这个枚举在另一个标题NvDefs.h中定义,我在其中使用了许多结构和枚举NvCommon.h.由于循环依赖,我无法构建它.我知道转发声明枚举是不可能的.
在这种情况下可以做些什么?这是我设计的问题吗?我是否必须引入另一个头文件来解决这个问题?
我不是C专家.请帮我.我的设计可能有问题,我知道可以通过引入另一个头文件来修复此循环依赖.我想知道的是"这是唯一的方法".寻找备用解决方案(如果有).
如果它有用,我会发布完整的代码.
我想知道如何或者如果我可以在以下类中enum payloadTypes使用我的私有方法访问我的公共threshold():
class A {
private:
unsigned int threshold(payloadTypes kindOfPayload,int x,int y);
public:
enum payloadTypes {
INVALID =-1,
TEST=0,
THRESHOLDS,
RX,
};
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我会收到此错误,并且我不想将我的枚举范围更改为 private
错误:'payloadTypes'尚未声明
unsigned int threshold(payloadTypes kindOfPayload,int x,int y);
假设我有以下代码:
// exposition-only, I can't use this macro in my solution
#if defined(HAS_MY_ENUM)
enum my_enum {
zero,
one,
};
#endif
enum empty {
placeholder, // an enum must always have a value
};
Run Code Online (Sandbox Code Playgroud)
我希望有一个条件类型别名my_enum_or_empty,如果已定义,则设置为my_enum,否则设置为empty,例如:
using my_enum_or_empty = std::conditional<my_enum_exists, my_enum, empty>;
Run Code Online (Sandbox Code Playgroud)
我想要一个基于 SFINAE 的解决方案,它可以为我提供my_enum_exists.
我正在考虑这种方法,但它需要 的前向声明my_enum,并且不能前向声明,因为它是无大小的。我无法添加尺寸,因为它enum来自外部库。你有什么想法?
我的用例是,这my_enum是在我无法控制的外部 C 库中定义的。我需要针对该库的两个版本(带my_enum和不带)编译我的代码。定义的标头源my_enum不能更改,即它必须是旧的 C 样式enum。
编译时不知道库版本。可惜没有LIBRARY_VERSION宏。我只需要依靠这一点 …
我正在使用visual studio 2010,并且不能完全搞定,这个类怎么错(语法错误:标识符'EnumType')并且不会编译:
class BrokenClassWithEnum
{
private:
void useEnum (EnumType enumType); //syntax error : identifier 'EnumType '
public:
enum EnumType
{
VAL1,
VAL2,
VAL3
};
}
Run Code Online (Sandbox Code Playgroud)
这没关系:
class WorkingClassWithEnum
{
public:
enum EnumType
{
VAL1,
VAL2,
VAL3
};
private:
void useEnum (EnumType enumType);
}
Run Code Online (Sandbox Code Playgroud)
班级范围发生了什么变化?
Maumau_game.h:
#ifndef MAUMAU_GAME_H_
#define MAUMAU_GAME_H_
#include <more_includes>
#include "Player.h"
enum game_status {
STATUS_NONE = 0,
STATUS_DRAW_2 = 1,
};
class Maumaugame_holder {
methods();
};
#endif /* MAUMAU_GAME_H_ */
Run Code Online (Sandbox Code Playgroud)
Player.h:
#ifndef PLAYER_H_
#define PLAYER_H_
#include <vector>
#include "Maumau_game.h"
#include "Card.h"
class Player {
more_methods();
public:
void do_turn(game_status g_status, const Card upper_dropped_card,
Deck& talon); //Error: >>game_status<< not declared
};
#endif /* PLAYER_H_ */
Run Code Online (Sandbox Code Playgroud)
我不知道为什么没有声明枚举game_status.我已正确包含标题,它在范围内,不是吗?我无法在"Player.h"中声明枚举.我会宣布它两次.你能帮我吗?你有什么建议吗?
(我不允许使用C++ 11)
提前致谢
我对编程非常陌生,正在使用 C++。
在我的头文件:Globals.h 中,我声明了我的枚举“Colour”和一个用于测试它的函数。
在我的源文件 Globals.cpp 中,我定义了枚举和测试函数。
在 main 中,我调用该函数,但收到以下消息:
错误 C2027:使用未定义的类型“颜色”
和
错误 C2065:“COLOUR_BLACK”:未声明的标识符。
我的代码如下:
Globals.h
#ifndef GlOBALS_H
#define GLOBALS_H
enum class Colour;
void print_Colour(Colour whatColour);
#endif
Run Code Online (Sandbox Code Playgroud)
和:
Globals.cpp
#include <iostream>
#include "Globals.h"
enum class Colour
{
COLOUR_BLACK,
COLOUR_BROWN,
COLOUR_BLUE,
COLOUR_GREEN,
COLOUR_RED,
COLOUR_YELLOW
};
void print_Colour(Colour whatColour)
{
switch (whatColour)
{
case Colour::COLOUR_BLACK:
std::cout << "Black" << "\n";
break;
case Colour::COLOUR_BROWN:
std::cout << "Brown" << "\n";
break;
case Colour::COLOUR_BLUE:
std::cout << "Blue" << "\n";
break;
case Colour::COLOUR_GREEN:
std::cout << …Run Code Online (Sandbox Code Playgroud)