C++ 在派生类中使用基类typedef
我尝试在派生类中使用基类typedef作为返回类型C++ 在派生类中使用基类typedef,c++,C++,我尝试在派生类中使用基类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>:
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;
}
模板
阶级基础{
公众:
typedef size_t size_type;
虚拟大小\类型大小()=0;
};
模板
派生类:公共基{
公众:
使用typename Base::size\u type;
虚拟大小_type size();
};
模板
typename派生::size\u type派生::size(){
返回1;
}
clang可以编译代码,而msvc不能。编译器说“大小的定义与其声明不匹配”
我修改代码:
template <typename T>
typename Base<T>::size_type Derived<T>::size() {
return 1;
}
模板
typename基::大小\派生类型::大小(){
返回1;
}
情况正好相反
我认为typename Base::size\u type
更有意义,因为在基类中声明的虚拟函数也使用基类typedef。但是叮当声是不允许的
如果必须使用类外定义,如何修改代码以使其由两个编译器编译 严格来说,如果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;
}
#包括
模板
阶级基础{
公众:
typedef std::size\u t size\u type;
虚拟大小\类型大小()=0;
};
模板
派生类:公共基{
公众:
虚拟typename基::大小\类型大小();
};
模板
typename基::大小\派生类型::大小(){
返回1;
}
什么编译器版本?我有VS2017,它编译代码没有问题。@BoPersson也是VS2017。我得到错误C2244。我发现使用size\u type=typename Base::size\u type代码>解决了模棱两可的问题。