我正在构建一个应用程序,在该应用程序中我有一个可以在我的大多数类中访问的日志函数,声明如下:
FileHandler.h
#ifndef FILEHANDLER_H
#define FILEHANDLER_H
#pragma once
#include <SDL.h>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <cctype>
//Include to allow logging
#include "log.h"
class fileHandler
{
public:
fileHandler();
virtual ~fileHandler();
void WriteToFile(const std::string& filename, std::string textToWrite);
std::vector<std::string> ReadFromFile(const std::string& filename);
std::string& TrimString(std::string& stringToTrim);
protected:
private:
class log logHandler;
std::vector<std::string> blockOfText;
std::string currentLine;
};
#endif // FILEHANDLER_H
Log.h
#ifndef LOG_H
#define LOG_H
#pragma once
#include <SDL.h>
#include <string.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <time.h>
class log
{
public:
log();
virtual ~log();
void static WriteToConsole(std::string textToWrite);
void WriteToLogFile(std::string textToWrite);
protected:
private:
};
#endif // LOG_H
这很好用了很长时间然后我想在我的应用程序的其他地方包含另一个函数,它只与C ++ 11兼容,所以我告诉编译器编译到这些标准。然后我在“log logHandler”上收到错误,说日志不是声明的名称。
我能够通过将行更改为
来解决问题class log logHandler;
我想知道是否有人能告诉我C ++ 03和C ++ 11之间有什么变化要求我这样做?
编辑:包含所有相关代码,以使问题更加完整。
答案 0 :(得分:4)
您没有显示您的真实代码(在类声明的末尾缺少;
,没有#endif
),但您的问题很可能与std::log
有关,它已经在C ++ 11中收到了一个新的重载,并在代码中的某个位置结合了using namespace std
。
请注意,新的重载可能与手头的问题无关;真正的原因很可能是在编译器的标准库实现中的某处导致内部#include <cmath>
的变化。这意味着即使在C ++ 03中,您的代码只是纯粹巧合,并且始终允许符合标准的C ++ 03编译器拒绝它。
以下是可以重现您的问题的示例程序:
#include <cmath>
using namespace std;
struct log
{
};
int main()
{
// log l; // does not compile
struct log l; // compiles
}
答案 1 :(得分:0)
关于您发布的代码的处理方式没有任何改变。
我怀疑的是,某处有
#include <cmath>
在此之下,其他地方
using namespace std;
这会导致您的编译器无法明确地解析名称log
,因为std::log
(一个函数)和您的类日志。
通过明确声明class log
,您告诉编译器您正在引用该类。