我的问题很常见,但我一直在寻找和尝试我找到的所有解决方案,但仍然无效.所以任何帮助将不胜感激!=)
提前致谢!
我在编译时遇到此错误:
g++ -ISFML/include -Iclasses/ -W -Wall -Werror -c -o classes/Object.o classes/Object.cpp
In file included from classes/Core.hh:18:0,
from classes/Object.hh:4,
from classes/Object.cpp:1:
classes/MapLink.hh:9:1: error: invalid use of incomplete type ‘struct Object’
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’
In file included from classes/Core.hh:19:0,
from classes/Object.hh:4,
from classes/Object.cpp:1:
classes/Player.hh:9:1: error: invalid use of incomplete type ‘struct Object’
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’
make: *** [classes/Object.o] Error 1
Run Code Online (Sandbox Code Playgroud)
所以基本上,我有一个主要包含(main.cpp)
#include "Core.hh"
int main(void)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这是包含我所有包含的头文件(Core.hh)
#ifndef __CORE_HH__
# …Run Code Online (Sandbox Code Playgroud) 所以我最近在使用Visual C++ 2012时遇到了这个非常令人沮丧的问题.直到几个小时前,我编写的代码很好,一切都按预期工作,直到我决定优化一些东西并删除一些类.我修复了由此引发的所有错误,例如false包括等等.不幸的是,在此之后VS编译器发疯了.它开始给我错误,如:
Error 14 error C2653: 'Class' : is not a class or namespace name
Run Code Online (Sandbox Code Playgroud)
甚至
Error 5 error C2143: syntax error : missing ';' before '}'
Error 4 error C2059: syntax error : '>'
Run Code Online (Sandbox Code Playgroud)
我已经多次检查了,一切都在它的正确位置:包括所有标题,所有符号放在它们应该的位置.
据我所知,问题不在于我的代码,而在于编译器本身......我想,Visual Studio有时会非常烦人.无论如何,如果有人能帮我解决这个问题,我真的很感激.
(顺便说一句,禁用预编译头也没有工作)
代码的相关部分:
错误14:
#include "PlayerEntity.h"
PlayerEntity::PlayerEntity(void) {} // This line causes the error
Run Code Online (Sandbox Code Playgroud)
错误5:
class GameScreen : public BaseScreen
{
public:
...
private:
...
}; // This line causes the error
Run Code Online (Sandbox Code Playgroud)
错误4:
private:
std::vector<BaseEntity*> _EntityList; // This line causes …Run Code Online (Sandbox Code Playgroud) 我知道基本的规则,使用inline,enum而const不是#define,这不是我追求这个问题.我想知道的是#define在C++中使用宏以及如何使用宏的可接受场景.
请不要发布问题或链接到"define vs const"问题或"预处理器与编译器",我已经通过了Scott Meyers的Effective C++,我知道一个优于另一个的优点.
然而,经过几个小时的网上冲浪,我觉得#define被认为是C++中的某种弱者,但我确信必须有一个案例,使用它可以接受甚至是可取的.
为了推动这个问题,我猜想我可以想到的一个场景是创建一个DEBUG基于它的宏,它可以打印所有代码以及用于调试目的的所有内容.
gcc 4.4.4 c89
我只是想知道在创建类型时是否应该遵循任何标准.
例如:
typedef struct date
{
} date_t;
Run Code Online (Sandbox Code Playgroud)
我也看到人们把这样的资本投入:
typedef struct date
{
} Date;
Run Code Online (Sandbox Code Playgroud)
或者变量
typedef unsigned int Age;
Run Code Online (Sandbox Code Playgroud)
或这个
typedef unsigned int age_t;
Run Code Online (Sandbox Code Playgroud)
是否有任何应遵循的标准.我个人更喜欢用_t进行后固定.
非常感谢任何建议,
我想创建一个struct具有一定对齐的.
我想对GCC和VisualC++编译器使用相同的结构定义.
在VisualC++中,通常会这样做:
__declspec(align(32))
struct MyStruct
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
在GCC中,通常会这样做:
struct MyStruct
{
// ...
} __attribute__ ((aligned (32)));
Run Code Online (Sandbox Code Playgroud)
我当然可以创建适当的宏来使其工作:
BEGIN_ALIGNED_STRUCT(32)
struct
{
// ...
}
END_ALIGNED_STRUCT(32)
;
Run Code Online (Sandbox Code Playgroud)
因此能够透明地处理这两种情况,但在这里我必须复制对齐常量(32),我想避免.
在GCC另一种方法是把__attribute__结构体标签后,作为中提到的文档,就像这样:
struct __attribute__ ((aligned (32))) MyStruct
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
因此我可以使这种类型的语法工作:
ALIGNED_STRUCT(32) MyStruct
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
有没有人有更好的版本?其他想法?我尝试了一些代码搜索,但没有找到任何有希望的东西.
更新:基于@John的评论,这是另一个可以工作的版本(我没有编译它,但文档表明这是一个好主意)
struct MyStruct_Unaligned
{
// ...
};
TYPEDEF_ALIGNED(32, MyStruct_Unaligned, MyStruct);
// Would expand to one of:
//
// typedef __declspec(align(32)) MyStruct_Unaligned MyStruct;
// …Run Code Online (Sandbox Code Playgroud) 我正在使用GCC; __FILE__返回当前源文件的完整路径和名称:/path/to/file.cpp.有没有办法file.cpp在编译时获取文件的名称(没有它的路径)?是否可以以便携方式执行此操作?模板元编程可以应用于字符串吗?
我在错误记录宏中使用它.我真的不希望我的源代码完整路径进入可执行文件.
我正在使用优先级队列作为具有一个额外要求的调度程序.我需要能够取消预定的项目.这相当于从优先级队列的中间删除项目.
我无法使用std::priority_queue除了top之外的任何元素的访问受到保护.
我正在尝试使用algorithm堆函数.但我仍然错过了我需要的那件作品.当我从堆中间删除一个元素时,我希望它能够有效地重建它自己.C++提供了这些堆函数:
std::make_heap O(3N)std::push_heap O(LG(n))的std::pop_heap O(2 lg(n))我想要一个像std::repair_heap大O < 3n这样的新功能.我将它提供了取消项目所在的洞的位置,它将适当地调整堆.
不提供std::repair_heap功能似乎是一个巨大的疏忽.我错过了一些明显的东西吗
是否有提供符合stl标准的库std::repair_heap?
是否有更好的数据结构来建模调度程序?
注意:由于某些原因,
我没有使用std::map.
当您从Xcode创建一个嵌入CoreData的新应用程序时,您可以在委托的实现文件中获得这些行:
@synthesize window=_window;
@synthesize managedObjectContext=__managedObjectContext;
Run Code Online (Sandbox Code Playgroud)
仅使用下划线或双倍之间有什么区别?只写作有什么区别:
@synthesize window;
Run Code Online (Sandbox Code Playgroud) 我最近花了很多时间使用javascript,现在又回到了C++.当我从一个方法访问一个类成员时,我倾向于为它添加前缀this->.
class Foo {
int _bar;
public:
/* ... */
void setBar(int bar) {
this->_bar = bar;
// as opposed to
_bar = bar;
}
}
Run Code Online (Sandbox Code Playgroud)
在阅读时,它在试图找出它来自何处时为我节省了大脑周期.
我有什么理由不这样做吗?
c++ ×7
c ×2
g++ ×2
macros ×2
inheritance ×1
makefile ×1
objective-c ×1
standards ×1
stl ×1
typedef ×1
visual-c++ ×1
xcode ×1