- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个名为 Sprt 的类(基本上是一个智能指针作为练习),下面是声明。为了清楚起见,我省略了实现。还有 2 个类来测试它。我已经包含了他们的代码。但是,当我在函数 basic_tests_1
中编写测试代码时,出现编译器错误。我不清楚如何解决它。有什么问题?
#include <iostream>
#include <stdio.h>
#include <assert.h>
namespace my {
template <class T>
class Sptr {
private:
//some kind of pointer
//one to current obj
T obj;
size_t reference_count;
//one to original obj
public:
Sptr();
template <typename U>
Sptr(U *);
Sptr(const Sptr &);
template <typename U>
Sptr(const Sptr<U> &);
template <typename U>
Sptr<T> &operator=(const Sptr<U> &);
void reset();
T* operator->() const
{return &obj;};
T& operator*() const
{return obj;};
T* get() const
{return &obj;};
};
}
using namespace std;
using namespace my;
/* Basic Tests 1 ================================================================================ */
class Base1 {
protected:
Base1() : derived_destructor_called(false) {
printf("Base1::Base1()\n");
}
private:
Base1(const Base1 &); // Disallow.
Base1 &operator=(const Base1 &); // Disallow.
protected:
~Base1() {
printf("Base1::~Base1()\n");
assert(derived_destructor_called);
}
protected:
bool derived_destructor_called;
};
class Derived : public Base1 {
friend void basic_tests_1();
private:
Derived() {}
Derived(const Derived &); // Disallow.
Derived &operator=(const Derived &); // Disallow.
public:
~Derived() {
printf("Derived::~Derived()\n");
derived_destructor_called = true;
}
int value;
};
void basic_tests_1() {
// Test deleting through original class.
{
// Base1 created directly with Derived *.
{
Sptr<Base1> sp(new Derived);
{
// Test copy constructor.
Sptr<Base1> sp2(sp);
}
}
// Base1 assigned from Sptr<Derived>.
{
Sptr<Base1> sp2;
{
Sptr<Derived> sp(new Derived);
// Test template copy constructor.
Sptr<Base1> sp3(sp);
sp2 = sp;
sp2 = sp2;
}
}
}
}
int main(int argc, char *argv[]) {
cout << "Hello world";
basic_tests_1();
return 0;
}
这是编译错误:
Sptr.cpp: In destructor ‘my::Sptr<Base1>::~Sptr()’:
Sptr.cpp:109:9: error: ‘Base1::~Base1()’ is protected
Sptr.cpp:8:8: error: within this context
Sptr.cpp: In function ‘void basic_tests_1()’:
Sptr.cpp:142:39: note: synthesized method ‘my::Sptr<Base1>::~Sptr()’ first required here
Sptr.cpp: In member function ‘my::Sptr<Base1>& my::Sptr<Base1>::operator=(const my::Sptr<Base1>&)’:
Sptr.cpp:107:16: error: ‘Base1& Base1::operator=(const Base1&)’ is private
Sptr.cpp:8:8: error: within this context
Sptr.cpp: In function ‘void basic_tests_1()’:
Sptr.cpp:156:23: note: synthesized method ‘my::Sptr<Base1>& my::Sptr<Base1>::operator=(const my::Sptr<Base1>&)’ first required here
Sptr.cpp: In instantiation of ‘my::Sptr<T>::Sptr(U*) [with U = Derived; T = Base1]’:
Sptr.cpp:142:39: required from here
Sptr.cpp:102:9: error: ‘Base1::Base1()’ is protected
Sptr.cpp:56:20: error: within this context
Sptr.cpp:109:9: error: ‘Base1::~Base1()’ is protected
Sptr.cpp:56:20: error: within this context
Sptr.cpp: In instantiation of ‘my::Sptr<T>::Sptr(const my::Sptr<T>&) [with T = Base1]’:
Sptr.cpp:145:35: required from here
Sptr.cpp:102:9: error: ‘Base1::Base1()’ is protected
Sptr.cpp:61:38: error: within this context
Sptr.cpp:109:9: error: ‘Base1::~Base1()’ is protected
Sptr.cpp:61:38: error: within this context
Sptr.cpp: In instantiation of ‘my::Sptr<T>::Sptr() [with T = Base1]’:
Sptr.cpp:150:25: required from here
Sptr.cpp:102:9: error: ‘Base1::Base1()’ is protected
Sptr.cpp:50:16: error: within this context
Sptr.cpp:109:9: error: ‘Base1::~Base1()’ is protected
Sptr.cpp:50:16: error: within this context
Sptr.cpp: In instantiation of ‘my::Sptr<T>::Sptr(U*) [with U = Derived; T = Derived]’:
Sptr.cpp:152:45: required from here
Sptr.cpp:120:9: error: ‘Derived::Derived()’ is private
Sptr.cpp:56:20: error: within this context
最佳答案
看起来你的 base1 析构函数应该公开。您还应该将其声明为虚拟的,否则将无法正确调用派生类析构函数。此外,您在 base1 中定义了 operator= 并派生为私有(private),然后在测试代码中将共享 ptr 的一个实例分配给另一个实例时尝试使用它们。剩下的错误与被保护的 base1 构造函数有关,这意味着您不能直接实例化它。如果您真的想创建 base1 对象,可以将构造函数公开。
关于c++ - 纠正模板类的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725499/
我今天刚刚开始使用 while 循环,目前正在编写代码。我必须要求用户输入 while 循环的起始值和结束值。结果应显示起始值和结束值之间所有 4 的倍数。这是家庭作业,因此必须包含 while 循环
我需要一些帮助来了解导致我的应用程序泄漏的原因。应用程序使用 ARC。我在窗口上有一个 NSView,用作文件的放置区。当您将文件拖到窗口上时,我会选择路径和文件名以在应用程序的其他方面使用。 当我通
我在 prometheus 中配置了以下警报: alert: ClockSkewDetected expr: abs(node_timex_offset_seconds{job="node-expor
我在 stackoverflow.com 上看到了以下代码,并将其复制到您在 JMF 上提交的我的系统中: import Logging.LogRunner; //Logging.LogRunner
我正在尝试使用 AngularJS ( Project ) 进行 CRUD,我发现当我按下“Cadastrar”按钮时,它会不断插入数组,即使它是空的。我想要的是防止这种行为发生。 $sc
我有一个如下所示的数据框。我的 Date 字段的数据类型为 datetime64[ns]: symbol high low Date
我有一个 UINavigationControllers 数组,我想将其呈现在自定义侧面菜单 Controller 中。这一切都有效,但是当我将设备方向更改为横向,然后从之前以纵向呈现的数组中呈现 U
我正在处理需要加载到我的 postgresql 数据库中的第三方数据。我遇到了问题,有时我得到的时间是“24:00:30”,而实际上它应该是“00:00:30”。这拒绝了数据。 我尝试转换但没有成功。
我的主要目标是在 MySQL 中创建一个PROCEDURE,以根据传递的纬度和经度查询位置。该查询获取传递给 PROCEDURE 的特定半径内位置的 ID、纬度和经度。我还尝试添加一个 JOIN 来查
我正在创建以下测试触发器,以便在 UPDATE 操作发生时更新字段的值: CREATE TRIGGER `test_index` AFTER UPDATE ON `main_itemmaster` F
我正在尝试创建一个将时间转换为秒的过滤器,例如:01:30:10 到 5410 ,反之亦然,所以最后我的模型只有几秒钟的时间,用户可以看到更好的表示。 到目前为止,我设法使用指令创建了一个工作示例,但
我已经在 Google Play 上构建并发布了我的应用,一切正常。但我想知道如何才能提高我在市场上的知名度,如何出现在首页... 所以这是我的问题, 我是否必须纠正 Lint 警告面板(在 Ecli
我的问题是我有一个列,其中大量数据转储的格式略有错误。 VolumeNumber ------------ Volume 1Numbers 1 & 2 Volume 1Numbers 1 & 2 Vo
我只是在学习如何处理我的 C++ 代码中的错误。我写了这个例子,它寻找一个名为 some file 的文本文件,如果找不到就会抛出异常。 #include #include using names
我有 Project shell_script 和 virtualenv 的结构树是 shell_script/ENV/bin/python3这个目录树应该是什么样子的? 这是行不通的 #!/ENV/
我有 Project shell_script 和 virtualenv 的结构树是 shell_script/ENV/bin/python3这个目录树应该是什么样子的? 这是行不通的 #!/ENV/
使用 Gvim 的 vim-latexsuite,我正在编辑一个相当大的文档。 它由一个包含\begin{document}、\end{document} 等的主文档组成。 在这之间有很多部分写在另一
我需要为串行协议(protocol)进行一些设计,并且遇到了一些我认为其他地方必须考虑过的问题。 所以我想知道是否有一些关于设计串行协议(protocol)的最佳实践的建议。(请陈述一个易于验证的事实
我正在尝试使用 Django 创建一个简单的视频流网站。我使用 cv2 启动网络摄像头,使用 ZMQ 将数据从客户端传输到服务器。我发现了这个link 我用它编写了代码的网络部分。 代码本身工作正常,
我想编写一个自定义损失函数,该函数会惩罚低估权重的正目标值。它的工作方式类似于均方误差,唯一的区别是在所述情况下均方误差将乘以大于 1 的权重。 我是这样写的: def wmse(ground_tru
我是一名优秀的程序员,十分优秀!