2012-03-26 49 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