【问题标题】:Code compiles on MSVC, but not on GCC [duplicate]代码在 MSVC 上编译,但不在 GCC [重复]
【发布时间】: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


【解决方案1】:

你需要使用:

this->num_obj_inc();

详细解释见Why do I have to access template base class members through the this pointer?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 2021-09-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多