固定长度字符串使用模板

时间:2011-12-07 20:51:25

标签: c++

所以我有一个学校的作业,要求我使用模板创建一个固定长度的字符串类,作为一个大项目的一部分,但我开始使用固定长度字符串,所以我想我会来在这里寻求帮助。我没有太多的模板经验,这是导致我出现问题的原因。我目前的问题是在复制构造函数中,它给了我错误,我不知道如何处理。所以这是我的课程定义:

template <int T>
    class FixedStr
    {
    public:
                            FixedStr        ();
                            FixedStr        (const FixedStr<T> &);
                            FixedStr        (const string &);
                            ~FixedStr       ();
        FixedStr<T> &       Copy            (const FixedStr<T> &);
        FixedStr<T> &       Copy            (const string &);

    private:
        string Data;
    };

这是给我问题的复制构造函数:

template <int T>
    FixedStr<T>::FixedStr (const string & Str)
    {
        if (Str.length() == <T>)
            strcpy (FixedStr<T>.Data, Str);
    }

任何人都可以就如何处理这个问题给我一些建议吗?你看到是否有简单的错误,或者我是否以错误的方式处理问题?谢谢你能给我的任何帮助。

2 个答案:

答案 0 :(得分:3)

未经测试:我认为应该是

if (Str.length() == T)
        Data = Str;

首先,在访问模板参数时不使用尖括号。其次,您不要将strcpy用于C ++字符串,它们支持通过赋值进行复制。

请注意,您的班级不需要自定义析构函数或复制构造函数。

字母T通常用于类型参数。我只想使用LengthN

以下是您班级的修改版本:

#include <string>

template<int N> class FixedStr {
public:
  FixedStr(const std::string&);

private:
  std::string Data;
};

template<int N> FixedStr<N>::FixedStr(const std::string& Str) {
  if (Str.length() == N) Data = Str;
}

int main() {
  FixedStr<11> test("Hello World");
}

答案 1 :(得分:1)

除非修改类型,否则无需将T放在尖括号中。所以它应该是Str.length() == T

您无法在strcpy上使用string,必须使用c_str()方法获取兼容的以null结尾的字符串。但这并不重要,因为您不应该使用strcpy来分配string对象。只需使用Data = Str