小编Jur*_*aho的帖子

找不到基类模板中的成员

可能重复:
为什么我必须通过this指针访问模板基类成员?

我有一个类似下面的类层次结构:

template<typename T>
class Base {
protected:
    T t;
};

template<typename T>
class Derived: public Base<T> {
public:
    T get() { return t; }
};

int main() {
    Derived<int> d;
    d.get();
}
Run Code Online (Sandbox Code Playgroud)

问题是在基类中找不到受保护的成员变量t。编译器输出:

prog.cpp: In member function 'T Derived<T>::get()':
prog.cpp:10:22: error: 't' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

那是正确的编译器行为还是仅仅是编译器错误?如果正确,为什么会这样呢?最好的解决方法是什么?

使用完全限定的名称是可行的,但这似乎是不必要的冗长:

T get() { return Base<T>::t; }
Run Code Online (Sandbox Code Playgroud)

c++ templates

5
推荐指数
1
解决办法
769
查看次数

从Lua堆栈安全地读取字符串

如何安全地从Lua堆栈中读取字符串值?函数lua_tostring和lua_tolstring两者都可能引发Lua错误(longjmp /奇怪类型的异常).因此,应该使用lua_pcall可能的保护模式调用这些函数.但我无法找到一个很好的解决方案,如何做到这一点,并从Lua堆栈获取字符串值到C++.是否真的需要lua_tolstring使用保护模式调用lua_pcall?

实际上使用lua_pcall似乎很糟糕,因为我想从Lua堆栈中读取的字符串是存储的错误消息lua_pcall.

c++ lua

5
推荐指数
1
解决办法
5155
查看次数

平衡 KD 树:哪种方法更有效?

我正在尝试使用 KD 树来平衡一组 (Million +) 3D 点,我有两种方法可以做到。

方式一:

  1. 使用 O(n) 算法沿给定轴查找数组大小/第 2 个最大元素并将其存储在当前节点

  2. 迭代向量中的所有元素,对于每个元素,将它们与我刚刚找到的元素进行比较,并将较小的放在 newArray1 中,将较大的放在 newArray2 中

  3. 递归

方式二:

  1. 使用快速排序 O(nlogn) 沿给定轴对数组中的所有元素进行排序,获取位置 arraysize/2 的元素并将其存储在当前节点中。

  2. 然后将索引 0 到 arraysize/2-1 的所有元素放入 newArray1,将 arraysize/2 到 arraysize-1 的所有元素放入 newArray2

  3. 递归

方式 2 看起来更“优雅”,但方式 1 似乎更快,因为中位数搜索和迭代都是 O(n),所以我得到 O(2n),它只是减少到 O(n)。但同时,即使方式2是O(nlogn)的排序时间,将数组拆分为2可以在恒定时间内完成,但这是否弥补了O(nlogn)的排序时间?

我该怎么办?或者有没有更好的方法来做到这一点,我什至没有看到?

sorting algorithm tree performance kdtree

5
推荐指数
1
解决办法
1143
查看次数

如何模拟方法模板的虚拟性

我有一个类层次结构,我想引入一个方法模板,就像它是虚拟的一样.例如一个简单的层次结构:

class A {
  virtual ~A() {}

  template<typename T>
  void method(T &t) {}
};

class B : public A {
  template<typename T>
  void method(T &t) {}
};
Run Code Online (Sandbox Code Playgroud)

然后我创建对象B:

A *a = new B();
Run Code Online (Sandbox Code Playgroud)

我知道我可以获取存储在类型a的typeid(a).B::method当我知道类型时,如何动态调用正确的?我可能有这样的情况:

if(typeid(*a)==typeid(B))
    static_cast<B*>(a)->method(params);
Run Code Online (Sandbox Code Playgroud)

但我想避免有这样的条件.我正在考虑创建一个std::mapwith typeid作为一个键,但我会把它作为一个值?

c++ polymorphism templates

4
推荐指数
2
解决办法
1113
查看次数

javascript onclick获取div ID?

单击使用JavaScript是否可以获取2 div标签的ID?

<div id="main">
<div id="content">
</div>
<button onclick="function();">show it</button>
</div>
Run Code Online (Sandbox Code Playgroud)

我这里有2个div标签。第一个div位于主div中,而内容div位于主div内部,按钮也位于主div内部。

单击按钮是否可以获得2 div标签的主要和内容 ID?

按下按钮时的预期输出:

alert: main
alert: content
Run Code Online (Sandbox Code Playgroud)

html javascript

3
推荐指数
1
解决办法
2万
查看次数

高效的指向C++中的整数映射和查找的指针

我想将指针映射到整数以用于序列化.指针可以是不同类型的,并且可以指向可能使用多重继承的多态对象.我需要查询地图以了解指针是否存储在其中,如果存在,那么相关的整数值是什么.

这样做的正确方法是什么?

map<void*, int>我想到的简单方法不起作用,因为operator <没有为任意指针定义.或者这在普通系统上不是问题吗?

另一个解决方案是拥有一个vector<void*>.但是这需要遍历存储在其中的所有指针,并且我不确定转换void *是否不会operator ==使用继承来破坏for对象.

c++ pointers map

2
推荐指数
1
解决办法
658
查看次数

std :: string是否比QString差?

我的一位同事声称,实施特别是内存管理std::string不如QStringQt库中的实现.这std::string也可以指出哪些方面?

c++ qstring qt stdstring

2
推荐指数
1
解决办法
1024
查看次数

Ray-Capsule交叉口

我有两点定义的胶囊A和B和半径r.光线由等式定义:X = O + D*t.现在我需要获得t所有(0-2)交叉点.

一个可能的解决方案将是,以计算与球体相交A和B和交叉点与汽缸.然后因为胶囊是凸的,我只需要取所有结果t值的最小值和最大值.

但正如维基百科所述,胶囊相交测试应该比圆柱相交测试更简单.有人能指出我有效的胶囊射线交叉算法吗?

algorithm math geometry intersection

1
推荐指数
1
解决办法
3902
查看次数

将模板参数作为模板类的朋友

我正在调试一个与第三方库交互的应用程序,其代码不可用,只有头文件和 .so 可用。现在我可以将它加载到调试器中并检查在第三方库中声明的类的私有成员的变量值,但是由于对象的数量很大,我想创建一些机制来在控制台上打印它,我可以稍后分析。我想出了这样的事情

第三方头文件

class A
{
    private:
    int i;
};
Run Code Online (Sandbox Code Playgroud)

我没有在上面的课程中包含额外的细节

调试打印机.cpp

#include <thirdpartheaders>

template <typename T> class debugprinter
{
    friend class T;
    public :
    void printonconsole()
    {
        T a;
        std::cout << std::endl << a.i << std::endl;
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我试图在上面编译,但似乎我不能将未定义的类型 T 声明为我的模板类的朋友并得到这个错误

错误:无法从 x::acc() 访问 i

现在我可以通过创建非模板调试打印机来解决这个问题,但出于好奇,有没有一种方法可以创建一个模板类,它会成为它的输入类型参数的朋友?

谢谢

c++ templates friend

1
推荐指数
1
解决办法
1191
查看次数

调用尚未构造的对象的方法

有一个简单的课程:

class A {
public:
  A() {}
  void set(int value) { value_ = value; }

private:
  int value_;
};
Run Code Online (Sandbox Code Playgroud)

及其全局实例:

A a;
Run Code Online (Sandbox Code Playgroud)
  1. set在尚未构造的对象上调用方法是否可以a?例如,当a.set(123)从另一个翻译单元中的另一个全局对象的构造函数调用时,就会发生这种情况.

  2. 当后来为对象a调用a.set(123)非参数和空构造函数时,通过调用设置的对象中的值是否会保留?Aa

c++

0
推荐指数
1
解决办法
144
查看次数

Qt - 如何异步创建窗口小部件?

我想异步创建一个小部件,然后将其分配给主线程中的对话框.我有一个函数来创建小部件:

shared_ptr<QTableWidget> createTable() {
    auto table = make_shared<QTableWidget>()

    // ... add some items to the table

    return table;
}
Run Code Online (Sandbox Code Playgroud)

当我同步调用此函数时,一切都按预期工作.问题是当我异步调用此函数时:

auto futureWidget = QtConcurrent::run(createWidget);
Run Code Online (Sandbox Code Playgroud)

我使用QFutureWatcher::finished()信号,当小部件创建完成后,我尝试将该小部件添加到主/ GUI线程中的对话框.

问题是,当我向表中添加项目时,有时它只会与SIGSEG崩溃.有时,当它完成时,未显示创建的小部件.关于在GUI线程外部使用pixmap,标准输出上还有很多警告.

在Qt中不可能在不同的线程中创建小部件吗?如果有可能,该怎么办?

c++ qt

0
推荐指数
1
解决办法
880
查看次数