我的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为空。

最佳答案

问题是您将要创建回文的集合作为指针传递。这意味着,从std::string中将其视为字符串数组,因此执行x[0]以外的任何操作都将导致未定义的行为。

而是将其作为非指针传递,并在需要时使用指针模板类型创建palindrom

palindrom<int*> A;
palindrom<char*> B;
palindrom<string> C;


这样,你可以

bool palindrome(const T& x, int length);


它也适用于std::string

10-08 00:50