加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何将模板中的非依赖名称的msvc代码移植到Linux?

发布时间:2020-12-14 04:59:25 所属栏目:百科 来源:网络整理
导读:我可以处理移植平台相关的功能.我有一个问题,我在 Linux上尝试的编译器(clang和g)不接受以下代码,而msvc编译器执行: template class Tclass Base {protected: T Value;};template class Tclass Derived : public BaseT {public: void setValue(const T inVa
我可以处理移植平台相关的功能.我有一个问题,我在 Linux上尝试的编译器(clang和g)不接受以下代码,而msvc编译器执行:

template <class T>
class Base {
protected:
    T Value;
};

template <class T>
class Derived : public Base<T> {
public:
    void setValue(const T& inValue){
        Value = inValue;
    }
};

int main(int argc,char const *argv[])
{
    Derived<int> tmp;
    tmp.setValue(0);
    return 0;
}

g错误:

main.cpp: In member function ‘void Derived<T>::setValue(const T&)’:
main.cpp:11:3: error: ‘Value’ was not declared in this scope

我相信这是由于在第二类中使用了非依赖名称(Value). More information.

问题是我有一个非常大的代码库,其中经常使用这种类型的代码.我明白看标准时错了.然而,不必写这个 – >非常方便.或者基础< T> ::在每次使用Value之前.甚至用Base< T> :: Value写作;当您使用~20个基类成员时,在派生类的开头是有问题的.

所以我的问题是:是否有适用于Linux的编译器允许这种代码(有或没有额外的编译器开关)?或者是否有一些小修改可以让这些代码在Linux上编译?

解决方法

你必须说这个 – >值> Base< T> :: Value,因为Value是一个从属名称.或者,使用Base< T> :: Value添加;到您的派生类定义.没有办法解决这个问题.

微软的编译器只是不合标准的,我担心编码为供应商的风格而不是发布的C标准是你的不幸.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读