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

标签 c++ templates

我可以处理移植平台相关的功能。我有一个问题,我在 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 .

问题是我有一个非常大的代码库,其中经常使用这种类型的代码。我明白在看标准时这是错误的。但是不用写 this-> 很方便或 Base<T>::在每次使用前 Value .连写using Base<T>::Value;当您使用基类的 ~20 个成员时,在派生类的开头会出现问题。

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

最佳答案

你不得不说this->ValueBase<T>::Value ,因为 Value是从属名称。或者,添加 using Base<T>::Value;到您的派生类定义。没有办法解决这个问题。

Microsoft 编译器根本不符合标准,恐怕按照供应商的风格而不是已发布的 C++ 标准进行编码是你的不幸。

关于c++ - 如何将模板中具有非依赖名称的 msvc++ 代码移植到 Linux?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13140632/

相关文章:

c++ - exchange 或 compare_and_exchange 是否读取修改顺序中的最后一个值?

c++ - 使用 Indy TIdTCPServer 的 Windows 服务(CodeGear C++ XE5)中的内存泄漏

c++ - 类模板和函数模板的区别

c++ - 在编译时生成 BitCount LUT

c++ - 通过 FTP 上传文件的进度条 [C++]

c++ - Windows C++ 上的 std::fstream 读取文件

C++ 非平台相关的声音

html - 在电子邮件客户端中呈现 HTML 模板

javascript - Facebook Connect 按钮问题 - 请帮忙

C++:使用模板继承类