我的C ++程序有问题。我有一个模板类,它有一个函数bool,用于检查给定的单词或数组是否为回文结构。对于int和char,everythig很好,程序生成" yes",但是对于字符串程序启动但它给出了
PK4_5.exe中0x534408DA(msvcr120d.dll)的第一次机会异常: 0xC0000005:访问冲突读取位置0x00000003。未处理 PK4_5.exe中的异常0x534408DA(msvcr120d.dll):0xC0000005: 访问冲突读取位置0x00000003。
此代码有什么问题?
以下是代码:
主要功能:
#include "palindrom.h"
int main(){
int iTab[] = { 1, 2, 3, 2, 1 };
char cTab[] = "abcba";
string word ("aaaa");
palindrom<int> A;
palindrom<char> B;
palindrom<string> C;
if (A.palindrome(iTab, 5))
cout << "yes";
if (B.palindrome(cTab, strlen(cTab)))
cout << "yes";
if (C.palindrome(&word, word.length()))
cout << "yes";
return 0;
}
palindrom.h:
#pragma once
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class palindrom
{
public:
bool palindrome(const T*x, int length);
palindrom();
~palindrom();
};
template <typename T>
bool palindrom<T>::palindrome(const T* x, int length){
for (int i = length / 2 - 1; i >= 0; i--)
if (x[i] != x[length - i - 1])
return false;
return true;
}
template <typename T>
palindrom<T>::palindrom(){}
template <typename T>
palindrom<T>::~palindrom(){}
palindrom.cpp是空的。
答案 0 :(得分:2)
问题在于您将要创建回文的集合作为指针传递。这意味着,从std::string
您将其视为字符串数组,因此执行除x[0]
之外的任何操作都将导致未定义的行为。
而是将其作为非指针传递,并在需要时使用指针模板类型创建palindrom
:
palindrom<int*> A;
palindrom<char*> B;
palindrom<string> C;
这样,你可以拥有
bool palindrome(const T& x, int length);
它也适用于std::string
。
答案 1 :(得分:0)
将if (C.palindrome(&word, word.length()))
更改为if (C.palindrome(word.c_str(), word.length()))
。
另外,请勿将using namespace std;
放入头文件中,否则包含头文件的所有内容都将导入名称空间std,这可能不是所需的行为。