C++类模板:不是类型名称、静态或枚举数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++类模板:不是类型名称、静态或枚举数相关的知识,希望对你有一定的参考价值。
一个编译错误,VS2008:
错误 6 error C2327: “Multivac::CInitialCurve<T>::Curve”: 不是类型名称、静态或枚举数
出错的代码为:Curve<T> Front;
类模板的定义为:
emplate <class T>
class Curve
public:
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
protected:
//! Number of points.
int n_;
//! Points.
List<Vector<T> > points_;
//! Orientation (-1: unkonw orientation, 0: trigonometrical
//! orientation, 1: reverse orientation).
int orientation_;
public:
// Constructors.
Curve() throw();
// Destructor.
~Curve() throw();
// Basic methods.
void InitWithUnsortedPoints_ClosestPointMethod(List<Vector<T> >& points);
void AddPoint(Vector<T>& point);
void Copy(Curve<T>& C);
int GetNbPoints() const;
List<Vector<T> >& GetPoints();
int GetOrientation() const;
int SetOrientation(int orientation);
void ClearAll();
T GetDistanceToTheCurve(T x, T y);
T GetProjection(Vector<T>& X);
T GetSignedDistanceToTheCurve(T x, T y);
// Input/output methods.
void WriteText(ofstream& f);
void ReadText(string file_name, int orientation = -1);
; // Curve.
请问错在哪里?如何改正?
恩 是template 但不是这个问题。。。 ⊙﹏⊙
依赖受限名称不能作为类型看待,除非在它前面加一个关键字:typename
所以,你这样改:
typename Multivac::CInitialCurve<T>::Curve
就可以编译过了 参考技术A 错误 6 error C2327: “Multivac::CInitialCurve<T>::Curve”: 不是类型名称、静态或枚举数
C++ 使用内部枚举作为类模板
【中文标题】C++ 使用内部枚举作为类模板【英文标题】:C++ use inner enum for class template 【发布时间】:2017-10-14 13:59:01 【问题描述】:template <Type T>
class Socket
public:
enum class Type
TCP,
UDP
;
...
我如何使用枚举Type
作为类模板?我想将其用作Socket::Type::UDP
等。
我尝试在Socket
之前声明enum class Socket::Type
,但它不起作用。
【问题讨论】:
你会如何使用它?Socket<Socket<???>::Type::TCP>
我想用Socket::Type::TCP
不可能。在您提供参数之前,模板只是一个模板。
如果要将其保存在某物中,请考虑命名空间。
顺便说一句,为什么您的套接字是模板?套接字不只是二进制数据流吗?
【参考方案1】:
每个Socket<...>
都有一个不同的Type
枚举。除了单独的枚举类型之外,不能使用Socket::Type
的一个原因是Socket
的特化甚至不能包含枚举,或者使Type
不是枚举。
您有两个主要选择:
使用单独命名的类/命名空间:
class Sockets
public:
enum class Type ... ;
;
template<Sockets::Type T>
class Socket ... ;
Socket<Sockets::Type::TCP> s;
使用单独的枚举类型:
enum class SocketType ... ;
template<SocketType T>
class Socket ... ;
Socket<SocketType::TCP> s;
或者,不要模板Socket
。你肯定会得到一堆if (T == TCP) ... else ...
。将公共部分完全分开并为 TCP 和 UDP 使用两种不同的实现可能会更好。
【讨论】:
以上是关于C++类模板:不是类型名称、静态或枚举数的主要内容,如果未能解决你的问题,请参考以下文章