【发布时间】:2014-05-27 03:28:13
【问题描述】:
我是 GCC 新手,正在尝试将代码移植到使用 MSVC 编译成功的 Linux。 下面的代码(一个可以复制粘贴和编译的小程序)会产生错误:
“‘num_obj_inc’没有依赖于模板参数的参数, 所以‘num_obj_inc’的声明必须可用[-fpermissive]”
#include <iostream>
using namespace std;
#define _SPTRDBG
#ifdef _SPTRDBG
#define SPTRDBG(x) x;
#else
#define SPTRDBG(x)
#endif
template<bool>
struct objCounter
{
void num_obj_inc(){}
void num_obj_dec(){}
};
template<>
struct objCounter<true>
{
#ifdef _SPTRDBG
static int num;
void num_obj_inc() { num++; }
void num_obj_dec() { num--; }
#endif
};
template<class C, bool bCnt=false>
class SPtr
: public objCounter<bCnt>
{
C* p;
public:
SPtr(C *_p)
:p(_p)
{
if ( p ) {
SPTRDBG( num_obj_inc() )
}
}
};
int main()
{
return 0;
}
我的猜测是 GCC 以某种方式优化了 noop "num_obj_inc(){}",但这段代码编译正常:
struct objCounter
{
void num_obj_inc(){}
void num_obj_dec(){}
};
class SPtr
: public objCounter
{
public:
SPtr(int *p)
//:p(_p)
{
if ( p ) {
SPTRDBG( num_obj_inc() )
}
}
};
编译错误的原因是什么?
【问题讨论】:
-
您没有从代码中删除
_SPTRDBG废话有什么特别的原因吗?还是错误取决于剩余的?我试图将您的示例简化为一个较小的测试,您可以在this gist 看到它。如果这仍然存在错误,您应该使用该代码更新您的问题。 -
您是否尝试将
-fpermissive添加到您的编译器标志中? -
@sharth - 我不确定 _SPTRDBG 宏是否与错误无关(模板扩展和预处理都发生在编译之前)。无论如何,您的链接提供了答案。谢谢。
-
你或@sharth 应该提供一个答案然后......
-
模板扩展绝对是正确编译的一部分...
标签: c++ visual-c++ gcc msvcrt