马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这段代码为啥报错?#include <iostream>
template <class T,int len>
class Array
{
private:
T items[len];
public:
Array()
{
memset(items, 0, sizeof(items));
}
~Array();
T& operator[](int i)
{
return items[i];
}
const T& operator[](int i)const
{
return items[i];
}
};
int main()
{
Array<std::string, 10> a;
a[0] = "哈哈";
}
1>------ 已启动生成: 项目: 模板示例:数组, 配置: Debug x64 ------
1>模板示例:数组.cpp
1>模板示例:数组.obj : error LNK2019: 无法解析的外部符号 "public: __cdecl Array<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,10>::~Array<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,10>(void)" (??1?$Array@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$09@@QEAA@XZ),函数 main 中引用了该符号
1>C:\Users\Administrator\source\repos\模板示例:数组\模板示例:数组\x64\Debug\模板示例:数组.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>已完成生成项目“模板示例:数组.vcxproj”的操作 - 失败。
========== 生成: 0 成功,1 失败,0 最新,0 已跳过 ==========
========== 生成 于 17:05 完成,耗时 03.543 秒 ==========
哦,打印出乱码就像是在茶馆里听见了一段古老的京剧,完全听不懂!码农朋友,这里有几个可能导致乱码的原因,让我们来一一排查。
1. **字符数组与字符串**:您在构建 `Array` 类的时候定义了一个 `T items;`,但是如果 `T` 是 `std::string` 或者其他类型且没有具体大小的话,直接用 `memset` 初始化可能会导致问题。`memset` 是用于设置内存的原始字节操作,不适合复杂数据类型(如 `std::string`)。对于字符串,请不要使用 `memset`,而是应该用构造函数去初始化。
2. **数组大小问题**:如果 `items` 是个动态数组或类似于这样的数据结构,你需要决定它的大小。举个例子,可以使用 `std::vector<T>` 来容纳任意数量的元素,它会自动管理内存。
3. **输出方式**:请确保您打印字符串的方式是正确的,尤其是关于编码。如果是 `char` 数组,用 `printf` 或者直接输出,而如果是 `std::string`,用 `cout`。
4. **修改后的代码示例**:
#include <iostream>
#include <string>
#include <vector>
template <typename T>
class Array {
private:
std::vector<T> items; // 使用 vector 来存储数组
public:
Array(int size) : items(size) { // 构造函数接受数组大小
for (auto& item : items) {
item = T(); // 初始化
}
}
~Array() = default;
T& operator[](int i) { // 正确重载下标操作符
return items.at(i); // 使用 at() 以防止越界
}
const T& operator[](int i) const {
return items.at(i);
}
};
int main() {
Array<std::string> a(10); // 创建一个容量为10的字符串数组
a[0] = "哈哈"; // 使用下标赋值
std::cout << a[0] << std::endl; // 打印第一个元素
}
在这个例子中,我使用 `std::vector` 管理动态大小的数组,并且通过下标访问字符串。这种情况下使用 `std::vector` 会更安全,也不会出现乱码问题。
试试看这个版本的代码!希望这次打印出来的是清晰可读的中文,而不是古怪的乱码!如果还有问题,就像你进了一个迷宫一样,继续向我询问,我们一起找到出口!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|