相关疑难解决方法(0)

C++协变模板

我觉得之前已经问过这个问题,但我无法在SO上找到它,也无法在Google上找到任何有用的信息.也许"covariant"不是我正在寻找的词,但这个概念与函数的协变返回类型非常相似,所以我认为它可能是正确的.这是我想要做的,它给了我一个编译器错误:

class Base;
class Derived : public Base;

SmartPtr<Derived> d = new Derived;
SmartPtr<Base> b = d; // compiler error
Run Code Online (Sandbox Code Playgroud)

假设这些课程充分充实......我想你明白了.它不能转换SmartPtr<Derived>成SmartPtr<Base>某种不明原因.我记得在C++和许多其他语言中这是正常的,虽然目前我不记得为什么.

我的根本问题是:执行此赋值操作的最佳方法是什么?目前,我正在将指针拉出,将其SmartPtr明确地向上转换为基类型,然后将其包装为新SmartPtr的适当类型(请注意,这不会泄漏资源,因为我们的本地SmartPtr类使用侵入式引用计数).那是漫长而凌乱的,尤其是当我需要将SmartPtr另一个对象包裹起来时...任何快捷方式?

c++ templates covariance

17
推荐指数
3
解决办法
5846
查看次数

将std :: function <void(Derived*)>转换为std :: function <void(Base*)>

首先,我定义了两个相互继承的类.

class A {
};
class B : public A {
};
Run Code Online (Sandbox Code Playgroud)

然后,我声明一个使用以下函数的函数std::function<void(A*)>:

void useCallback(std::function<void(A*)> myCallback);

最后,我std::function从我想要在回调函数中使用的其他地方收到一个不同的(但理论上兼容的)类型:

std::function<void(B*)> thisIsAGivenFunction;

useCallback(thisIsAGivenFunction);
Run Code Online (Sandbox Code Playgroud)

我的编译器(clang ++)拒绝这个,因为它的类型thisIsAGivenFunction与期望的类型不匹配.但是B继承自己A,接受它是有道理的thisIsAGivenFunction.

应该是吗?如果没有,为什么?如果它应该,那么我做错了什么?

c++ c++11 std-function

14
推荐指数
2
解决办法
2477
查看次数

带有接口对象的C++模板

我有以下不编译的代码.

class Base {
    public:
        virtual ~Base() { };
};

class Derived : public Base { };

class NotDerived { };

template <typename T>
class Group { };

int main() {
    Group<Base> *g = NULL;

    g = new Group<Base>();       // Works
    g = new Group<Derived>();    // Error, but I want it to work

    g = new Group<NotDerived>(); // Error, as expected
}
Run Code Online (Sandbox Code Playgroud)

我知道这不会编译,因为它g是一种不同的类型Group<Derived>.为了在Java中工作,我会做一些事情Group<? extends Base> g,但据我所知,C++没有那个关键字.可以做些什么?

编辑:我想澄清,我不希望它可以设置不从派生类型Base的g.我已经更新了我的例子来解释这一点.

编辑2:我的问题有两个解决方案. 戴夫的发现简单易行.但 …

c++ inheritance templates

7
推荐指数
2
解决办法
5384
查看次数

采用继承类的C++非类型模板参数

我希望能够传递从DBMetaData另一个类的非类型模板参数继承的对象的引用,DBVar:

#include    <iostream>

class   DBMetaData
{
public:
    virtual const char  *description( ) const   = 0;
};

class   DBMetaData_NT
:   public  DBMetaData
{
public:
    const char  *description( ) const
    {   return  "Useless description."; }
};

#if DO_WHAT_I_WANT
template< const DBMetaData &Metadata >
#else
template< typename MetadataType,
    const MetadataType &Metadata >
#endif  // DO_WHAT_I_WANT
class DBVar
{
public:
    /// Descrição da variavel.
    const char  *description( ) const
    {   return  Metadata.description( ); }
};

DBMetaData_NT       _md_u1;

#if DO_WHAT_I_WANT
DBVar< …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates template-specialization

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

C++模板协方差

你能在C++中使用协方差适用于泛型类型(通过模板)吗?

我已经发现这个问题回答了我的问题,但我再次问它,因为它已经有两年了!虽然有人解释说模板中的C++中没有协方差,但没有解释!

你能帮我讲解这个话题的新闻/解释吗?

c++ polymorphism templates covariance

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

C++中的模板:(F-)有界多态

我已经检查了一段时间的内联网,并找到了我的问题的任何答案.我想知道C++是否支持有界多态性和/或F-有界多态性.

例如,在Java程序员中可以做到这一点(boundedn polymorphism):

<T extends Car> void startEngine(T c) {/*body method*/}
Run Code Online (Sandbox Code Playgroud)

这个(F-有界多态性):

<T extends Comparable<T>> void compareWith(T c) {/*body method*/}
Run Code Online (Sandbox Code Playgroud)

在C++中有什么相同的东西吗?

谢谢!

c++ polymorphism

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

正确使用模板类

我有一个练习,其中我必须使用模板类“Garage”,该类将“汽车”或“自行车”作为参数。很简单,但我不断收到错误,因为我显然对模板的理解不够好。这是 :

template<class Car>
class Garage{
    Car array[10];
public:
    void addCar(int counter1);
    void removeCar(int counter1);
    void displayContents(int counter1);
};

template<class Motorbike>
class Garage{
    Motorbike array[10];
public:
    void addMotorbike(int counter2);
    void removeMotorbike(int counter2);
    void displayContents(int counter2);
};
 
Run Code Online (Sandbox Code Playgroud)

恰当的 ?我是否必须在类的每个函数前面插入模板?该程序当然包含更多的类和函数,但它是我需要在头脑中整理出来的模板。感谢您抽出宝贵的时间。

c++

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