C++ 如何使用模板专门化常量

C++ 如何使用模板专门化常量,c++,templates,C++,Templates,我想为模板类使用的每个不同类型返回一个不同的常量 例如,当类 堆栈我想要常数 空=-99 当类是Stack时,我希望常量为空为'\0' 到目前为止,我一直在寻找如何显式地专门化变量的语法,但不知道从哪里开始寻找 一个简单的代码示例将是惊人的,因为这个问题困扰了我一段时间 到目前为止,我没有常数的情况是: template<class T> class Stack { private: T* items_; //EMPTY constant here p

我想为模板类使用的每个不同类型返回一个不同的常量

例如,当类

堆栈我想要常数 空=-99

当类是Stack时,我希望常量为空为'\0'

到目前为止,我一直在寻找如何显式地专门化变量的语法,但不知道从哪里开始寻找

一个简单的代码示例将是惊人的,因为这个问题困扰了我一段时间

到目前为止,我没有常数的情况是:

template<class T>
class Stack {
private:
       T* items_;
        //EMPTY constant here

public:

    Stack();

    ~Stack();

    void push(T value);

    T pop();
};
然后在cpp文件中:

template<> int Stack<int>::EMPTY = -99;
template<> char Stack<char>::EMPTY = '\0';
注意:根据使用情况,这将限制可以实例化模板的类型

然后在cpp文件中:

template<> int Stack<int>::EMPTY = -99;
template<> char Stack<char>::EMPTY = '\0';

根据使用情况,这将限制您可以用.I/P>< P>实例化模板的类型。您可能需要考虑是否要将其作为堆栈的一部分,或者更确切地说,将其归纳为一般类。根据您所做的工作,它可能对其他数据结构有用

template<typename T>
struct traits
{
    static T empty;
};
template<> int traits<int>::empty = 99;
template<> char traits<char>::empty = 0;


template<class T>
class Stack 
{
public:
    Stack()
    {
        T t = traits<T>::empty; 
    }
};

int main()
{
    Stack<int>(); 
    Stack<char>(); 
}

您可能想考虑是否要将其作为堆栈的一部分,或者更确切地说,将其归纳为一般类。根据您所做的工作,它可能对其他数据结构有用

template<typename T>
struct traits
{
    static T empty;
};
template<> int traits<int>::empty = 99;
template<> char traits<char>::empty = 0;


template<class T>
class Stack 
{
public:
    Stack()
    {
        T t = traits<T>::empty; 
    }
};

int main()
{
    Stack<int>(); 
    Stack<char>(); 
}

返回常量值的函数是否足够?我的经验是,有时即使在非模板类中,普通常量也会制造麻烦。是的,那很好,我一直在尝试,但遇到了一些问题。但是所有的建议都是好的,返回一个常量值的函数就足够了吗?我的经验是,有时即使在非模板类中,普通常量也会制造麻烦。是的,那很好,我一直在尝试,但遇到了一些问题。但是所有的建议都是好的。这给了我一个错误:“Stack”的多重定义标准禁止专门化一个模板,如果你以前专门化了一个成员以获得相同的模板参数。因此,如果你想让堆栈专门用于int,那么首先声明类专门化,然后在cpp文件中定义静态-这只是普通的模板专门化另一个可能的错误来源是我为ctor和dtor设置了空定义,而你没有。我会编辑答案。遗憾的是,这个答案和下一个答案都不会为我编译。你写的代码在我看来非常符合逻辑,但是GCC不会停止抱怨多个定义。CMakeFiles\bonus_ass2.dir/objects.aa2_dynamic_stack.cpp.obj:a2_dynamic_stack.cpp:.data+0x0:DynamicStack的多个定义::EMPTY'CMakeFiles\bonus_ass2.dir/objects.amain.cpp.obj:main.cpp:.data+0x0:首先在这里定义CMakeFiles\bonus_ass2.dir/objects.aa2_dynamic_stack.cpp.obj:在函数_tcf_0:中:这给了我一个错误:“stack”的多个定义标准禁止专门化模板,如果您以前专门化了成员以获得相同的模板参数。因此,如果你想让堆栈专门用于int,那么首先声明类专门化,然后在cpp文件中定义静态-这只是普通的模板专门化另一个可能的错误来源是我为ctor和dtor设置了空定义,而你没有。我会编辑答案。遗憾的是,这个答案和下一个答案都不会为我编译。你写的代码在我看来非常符合逻辑,但是GCC不会停止抱怨多个定义。CMakeFiles\bonus_ass2.dir/objects.aa2_dynamic_stack.cpp.obj:a2_dynamic_stack.cpp:.data+0x0:DynamicStack的多个定义::EMPTY'CMakeFiles\bonus_ass2.dir/objects.amain.cpp.obj:main.cpp:.data+0x0:首先在这里定义CMakeFiles\bonus_ass2.dir/objects.aa2_dynamic_stack.cpp.obj:在函数_tcf_0'中: