声明变量时:未在此范围内声明的变量
When declaring a variable: variable not declared in this scope
我有代码:loading* loadingScreen = new loading(device);
当我编译程序时,编译器抱怨没有声明加载屏幕:
error: 'loadingScreen' was not declared in this scope
loading* loadingScreen = new loading(device);
^
我不确定是什么原因造成的。我尝试过的:
- 重写它以使构造函数不是 运行。
- 将声明重新定位到不同的代码部分。
- 确保正确包含我的 类。
这是我的 main.cpp 文件:
#include <iostream>
#include <irrlicht.h>
#include <future> // std::async, std::future
#include <chrono> // Millisecond timer
#include <pthread.h>
#include <loading.h>
#include <fps.h>
bool loading = false;
struct load_struct {
irr::IrrlichtDevice *device;
fps *fpsLevel;
};
void load(void * loadingStruct)
{
loading = true;
struct load_struct *args = (struct load_struct *) loadingStruct;
loading = false;
pthread_exit(NULL);
}
int main()
{
//Create display to optimal settings.
irr::IrrlichtDevice *device = irr::createDevice(irr::video::EDT_NULL);
irr::s32 depth = device->getVideoModeList()->getDesktopDepth();
irr::core::dimension2d<irr::u32> resolution = device->getVideoModeList()->getDesktopResolution();
device->drop();
device = irr::createDevice(irr::video::EDT_OPENGL, resolution, depth, true, true, true, NULL); // TODO: Change last parameter
if(device==NULL)
{
std::cout << "Unable to create device! Do you have graphics drivers installed?" << std::endl;
return 1;
}
//Open data files
device->getFileSystem()->addFileArchive("Resources",true,true,irr::io::EFAT_ZIP);
device->getFileSystem()->addFileArchive("Video.tar");
device->getFileSystem()->addFileArchive("Textures.tar");
device->getFileSystem()->addFileArchive("Models.tar");
device->getFileSystem()->addFileArchive("Audio.tar");
//Load first room.
loading* loadingScreen = new loading(device);
fps *fpsLevel = new fps();
pthread_t creationThread;
struct load_struct loadingStruct;
loadingStruct.device = device;
loadingStruct.fpsLevel = fpsLevel;
//pthread_create(creationThread,NULL,load,(void *)&loadingStruct); Fix me!
while(loading==false)
{
loadingScreen->update();
std::this_thread::sleep_for(std::chrono::milliseconds(1000/60));
}
loadingScreen->kill();
// Run first room.
fpsLevel->run();
//Clean up.
device->drop();
return 0;
}
这是我的 loading.h 文件:
#include <irrlicht.h>
#include <string>
#ifndef LOADING_H
#define LOADING_H
class loading
{
public:
loading(irr::IrrlichtDevice *device);
void update();
void kill();
protected:
int slide;
static const int SLIDES_AMOUNT = 60;
const std::string FILENAME_TEMPLATE = "Loading_Screen/%.png";
irr::video::ITexture* slides[SLIDES_AMOUNT];
};
#endif // LOADING_H
如有任何帮助,我们将不胜感激!
问题可能是由于您有两个不同的东西 loading
:
首先是您的 class loading
。但是,还有变量 bool loading
。所以当你这样做时:
loading* loadingScreen = new loading(device);
编译器遇到了歧义,似乎更喜欢变量 loading
而不是类型 loading
(我不是 C++ 专业人士,无法解释为什么会这样;我的猜测是因为该变量是该名称的最多 "recent" 定义)。
解决方法非常简单:使两个名称不同。由于 C++ 区分大小写,因此您应该采用以大写字母开头 class 名称的约定:使 class Loading
和 Loading* loadingScreen = new Loading(device);
.
我有代码:loading* loadingScreen = new loading(device);
当我编译程序时,编译器抱怨没有声明加载屏幕:
error: 'loadingScreen' was not declared in this scope
loading* loadingScreen = new loading(device);
^
我不确定是什么原因造成的。我尝试过的:
- 重写它以使构造函数不是 运行。
- 将声明重新定位到不同的代码部分。
- 确保正确包含我的 类。
这是我的 main.cpp 文件:
#include <iostream>
#include <irrlicht.h>
#include <future> // std::async, std::future
#include <chrono> // Millisecond timer
#include <pthread.h>
#include <loading.h>
#include <fps.h>
bool loading = false;
struct load_struct {
irr::IrrlichtDevice *device;
fps *fpsLevel;
};
void load(void * loadingStruct)
{
loading = true;
struct load_struct *args = (struct load_struct *) loadingStruct;
loading = false;
pthread_exit(NULL);
}
int main()
{
//Create display to optimal settings.
irr::IrrlichtDevice *device = irr::createDevice(irr::video::EDT_NULL);
irr::s32 depth = device->getVideoModeList()->getDesktopDepth();
irr::core::dimension2d<irr::u32> resolution = device->getVideoModeList()->getDesktopResolution();
device->drop();
device = irr::createDevice(irr::video::EDT_OPENGL, resolution, depth, true, true, true, NULL); // TODO: Change last parameter
if(device==NULL)
{
std::cout << "Unable to create device! Do you have graphics drivers installed?" << std::endl;
return 1;
}
//Open data files
device->getFileSystem()->addFileArchive("Resources",true,true,irr::io::EFAT_ZIP);
device->getFileSystem()->addFileArchive("Video.tar");
device->getFileSystem()->addFileArchive("Textures.tar");
device->getFileSystem()->addFileArchive("Models.tar");
device->getFileSystem()->addFileArchive("Audio.tar");
//Load first room.
loading* loadingScreen = new loading(device);
fps *fpsLevel = new fps();
pthread_t creationThread;
struct load_struct loadingStruct;
loadingStruct.device = device;
loadingStruct.fpsLevel = fpsLevel;
//pthread_create(creationThread,NULL,load,(void *)&loadingStruct); Fix me!
while(loading==false)
{
loadingScreen->update();
std::this_thread::sleep_for(std::chrono::milliseconds(1000/60));
}
loadingScreen->kill();
// Run first room.
fpsLevel->run();
//Clean up.
device->drop();
return 0;
}
这是我的 loading.h 文件:
#include <irrlicht.h>
#include <string>
#ifndef LOADING_H
#define LOADING_H
class loading
{
public:
loading(irr::IrrlichtDevice *device);
void update();
void kill();
protected:
int slide;
static const int SLIDES_AMOUNT = 60;
const std::string FILENAME_TEMPLATE = "Loading_Screen/%.png";
irr::video::ITexture* slides[SLIDES_AMOUNT];
};
#endif // LOADING_H
如有任何帮助,我们将不胜感激!
问题可能是由于您有两个不同的东西 loading
:
首先是您的 class loading
。但是,还有变量 bool loading
。所以当你这样做时:
loading* loadingScreen = new loading(device);
编译器遇到了歧义,似乎更喜欢变量 loading
而不是类型 loading
(我不是 C++ 专业人士,无法解释为什么会这样;我的猜测是因为该变量是该名称的最多 "recent" 定义)。
解决方法非常简单:使两个名称不同。由于 C++ 区分大小写,因此您应该采用以大写字母开头 class 名称的约定:使 class Loading
和 Loading* loadingScreen = new Loading(device);
.