2012-03-26 48 views
1

编辑:上溯造型源自模板化基地,在C++

我意识到,这个代码编译和工作原理:

#include <iostream> 

template<class Something> class Base { 
public: 
    Base() { 

    } 

    virtual ~Base() { 
    } 

    virtual void method() = 0; 
}; 

class Derived: public Base<std::string> { 
public: 
    Derived() { 

    } 

    virtual ~Derived() { 

    } 

    void method() { 
    } 
}; 

template<class Something> class TemplatedClass { 
public: 
    void method(Base<Something>* base) { 
    } 
}; 

class SomeClass: public TemplatedClass<std::string> { 
}; 

int main(int argc, char **argv) { 

    Derived* d = new Derived(); 

    Base<std::string>* b = d; 
    Base<std::string>* b1 = dynamic_cast<Base<std::string>*>(d); 
    Base<std::string>* b2 = static_cast<Base<std::string>*>(d); 

    SomeClass sc; 
    sc.method(b); 
    sc.method(b1); 
    sc.method(b2); 
} 

然后,我在做一个非常大的错误,准备骨架,甚至试图理解我自己的代码。多可惜!!!对不起...这是一个非常糟糕的问题。这将是更好地将其删除...

**没有意义的问题,下面的代码** 有鉴于此:

template<class Something> class Base 
{ 
    virtual void method() = 0; 
}; 

class Derived: public Base<std::string> 
{ 
    void method() { ... }; 
}; 

我想的Derived指针向下转换的Base的指针。我试图用dynamic_cast没有成功:

... 
Derived* d = new Derived(); 
Base* b = dynamic_cast<Base*>(d); 
... 

我在执行过程中总是出错。

我不知道我是否需要downcasting ,.我有这种情况:

template<class Something> class TemplatedClass 
{ 
    void method(Base<Something>* base) { ... }; 
}; 

class SomeClass : public TemplatedClass<std::string> { ... }; 

,我想打电话给(编辑整理*):

Derived* d = new Derived(); 

SomeClass sc; 
sc.method(d); 

但它给我一个转换错误。

我需要什么? Downcasting还是什么?

+3

我相信这是上传。 – 2012-03-26 09:56:07

+0

是的,它是上传! arrrgg ... – logoff 2012-03-26 10:30:57

回答

2

推测你的测试看起来像这样?

Base<std::string>* b = dynamic_cast<Base<std::string> *>(d); 

即它必须是一个铸造的实例化的模板,不Base没有类型参数。

等一下 - 你正在做派生基地!

Base<std::string>* b = d; 

这应该没问题!

你的第二个例子看起来不正确的 - 特别是:

SomeClass sc(); 

这应该是:

SomeClass sc; 

你能后的实际代码和确切的错误信息?

+0

我编辑过它,这是一个错误,抱歉。我不能发布真实的代码,它有我的公司形式的副本,对不起。我准备了类似的代码,只是用骨架来解释我的问题。当我尝试在没有投射和运行时错误的情况下直接调用函数时,我尝试执行static_cast,'没有匹配函数调用'和'o已知转换为参数1形式'的错误是'static_cast''',当我尝试dynamic_cast时。 – logoff 2012-03-26 10:16:29

+0

@logoff至少发布编译后的代码,或者产生完全相同的错误。 – 2012-03-26 10:17:29

+0

有没有版权问题阻止你给编译器错误? :) – 2012-03-26 10:17:30