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 但不是这个问题。。。 ⊙﹏⊙

这个是 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&lt;Socket&lt;???&gt;::Type::TCP&gt; 我想用Socket::Type::TCP 不可能。在您提供参数之前,模板只是一个模板。 如果要将其保存在某物中,请考虑命名空间。 顺便说一句,为什么您的套接字是模板?套接字不只是二进制数据流吗? 【参考方案1】:

每个Socket&lt;...&gt; 都有一个不同的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++类模板:不是类型名称、静态或枚举数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 模板(进阶)

C++——模板进阶

C++模板进阶操作 —— 非类型模板参数模板的特化以及模板的分离编译

c++重用和模板

[C++模板] --- 类模板

[C++模板] --- 类模板