在派生类中使用基类typedef

问题描述 投票:1回答:1

我尝试在派生类中使用基类typedef作为返回类型。

template <typename T>
class Base{
public:
    typedef size_t size_type;
    virtual size_type size() = 0;
};

template <typename T>
class Derived : public Base<T> {
public:
    using typename Base<T>::size_type;
    virtual size_type size();
};

template <typename T>
typename Derived<T>::size_type Derived<T>::size() {
    return 1;
}

clang可以编译代码,而msvc则不能。编译器说“大小的定义与其声明不符”。

我修改代码:

template <typename T>
typename Base<T>::size_type Derived<T>::size() {
    return 1;
}

情况正好相反。

我认为typename Base<T>::size_type更有意义,因为在基类中声明的虚函数也使用基类typedef。但铿锵不允许。

如果我必须使用类外定义,如何修改代码以使其由两个编译器编译?

c++
1个回答
1
投票

严格来说,如果Clang(和GCC,顺便说一句)接受你的代码,而MSVC没有,那通常不是你的代码有问题的迹象。 MSVC的模板实现长期以来一直不兼容。

然而,认识到我们生活在现实世界中并且不得不满足于不是最优的工具,你将不得不摆脱使用声明。两个编译器都将接受此修改后的代码:

#include <cstddef>

template <typename T>
class Base{
public:
    typedef std::size_t size_type;
    virtual size_type size() = 0;
};

template <typename T>
class Derived : public Base<T> {
public:
    virtual typename Base<T>::size_type size();
};

template <typename T>
typename Base<T>::size_type Derived<T>::size() {
    return 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.