【问题标题】:Templates. adding , getting element char*模板。添加,获取元素 char*
【发布时间】:2015-05-15 11:33:18
【问题描述】:

我的模板类有问题并将其用于 char*。 我在类中存储元素并尝试添加或获取元素,但出现分段错误。 没有 char* 类型的类专业化是否可能?

编辑 1: 假设我不能更改主函数中的代码,只能更改类和方法,但没有专门化。是否可以处理 char* ? ;)

#include <iostream>
#include <vector>
using namespace std;

template<class T>
class test
{
public:
    void addItem(T element){
        elements.push_back(element);
    }

    T getItem(int i){
        return elements[i];
    }

    vector<T> elements;
};

int main()
{
    char * cpt[]={"tab","tab2","tab3"};
    test<char*> test1;
    test1.addItem(cpt[1]);
    char * item=test1.getItem(0);
    //Segmentation fault
    // could it be done without specialisation class for char*    ?
    item[0]='Z';
    cout<<item<<endl;
    for(auto v:test1.elements) cout<<v<<endl;
    return 0;
}

My code

【问题讨论】:

    标签: c++ templates char containers


    【解决方案1】:

    您正在尝试修改常量字符串文字。这给出了未定义的行为;如果文字存储在写保护的内存中,通常是分段错误。

    在现代 C++ 中,程序甚至不应该编译,因为从字符串文字到非常量 char* 的不推荐转换最终在 C++11 中被禁止。

    如果您想存储可修改的字符串,最好使用std::string

    【讨论】:

    • 我不能改变输入,所以唯一合理的选择是做专业化吗?
    • @whiteNinja:我不明白你的意思。只需使用test&lt;std::string&gt; 而不是test&lt;char*&gt;
    • 问题是我无法改变它。只有类和方法
    • @whiteNinja 请编辑您的问题并添加以下信息:您想要实现什么以及您可以/不能在您发布的代码中更改什么。否则我们只是猜测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2014-03-10
    • 2012-09-11
    相关资源
    最近更新 更多