2012-06-29 53 views
3

所以我有一個模板化類,我想重載一個函數的行爲,當我有特定的類型,說char。對於所有其他類型,讓他們做自己的事情。但是,C++不會讓我重載這個函數。不能重載函數

爲什麼我不能重載這個函數?我真的不是想做模板專業化,因爲那樣我就得到了重複整個類。

這裏是一個玩具示例演示問題:http://codepad.org/eTgLG932

相同的代碼貼在這裏爲您的閱讀快感:

#include <iostream> 
#include <cstdlib> 
#include <string> 

struct Bar 
{ 
    std::string blah() { return "blah"; } 
}; 

template <typename T> 
struct Foo 
{ 
public: 
    std::string doX() 
    { 
    return m_getY(my_t); 
    } 

private: 
    std::string m_getY(char* p_msg) 
    { 
    return std::string(p_msg); 
    } 

    std::string m_getY(T* p_msg) 
    { 
    return p_msg->blah(); 
    } 

    T my_t; 
}; 

int main(int, char**) 
{ 
    Foo<char> x; 
    Foo<Bar> y; 
    std::cout << "x " << x.doX() << std::endl; 
    return EXIT_SUCCESS; 
} 

謝謝大家對你的建議。提出了兩個有效的解決方案。我可以專門化doX方法,或專門化m_getY()方法。

在一天結束的時候,我寧願保持我的專業私人而非公開,所以我接受了磷蝦的答案。

+2

無效DOX返回的東西。請解決這個問題。 –

+1

問:什麼編譯器?問:什麼是確切的錯誤信息?問:當T == char時,你認爲兩個「m_getY()」函數可能會發生衝突嗎? ;) – paulsm4

+0

@KirillKobelev很好,只是我的一個錯字。我解決了這個問題並更新了所有內容 – anio

回答

1

您可以使您的方法m_getY成爲一個成員函數模板。而且他們對char*這個函數模板進行了專門化,或者簡單地用一個char*參數定義一個方法。在這種情況下,你不必複製整個班級。

+0

This works too:http://codepad.org/9siIMaXn – anio

+0

該標準非常明確,具有固定類型參數的函數模板和簡單函數可以共存在過載桶中。 –

+0

@KirillKobelev這個(「具有固定類型的參數的簡單函數」)不是模板的專業化,與您的答案相矛盾。 – Walter

3
std::string m_getY(char* p_msg) 
    { 
    return std::string(p_msg); 
    } 

    std::string m_getY(T* p_msg) 
    { 
    return p_msg->blah(); 
    } 

這裏的問題是,當Tchar,你最終與具有相同簽名兩種功能。

+0

Doh。現在它很明顯,你指出了。我想我的大腦停止了工作。 – anio

7

您可以專門化一個特定類型的整個模板類中的一個函數,而無需專門研究整個類。它看起來像這樣:

template <> void Foo<char>::doX() { 
    /* custom implementation here */ 
} 

你很少在實踐中看到這一點,但這是完全合法的C++代碼。

希望這會有所幫助!

+0

+1只要成員函數本身不是模板,就可以工作。 – ildjarn

+0

好的,我試過了。它的工作原理:http://codepad.org/mAdZuMyN – anio

+0

我也試過這個。這在MSVC中起作用。雖然這真的是很糟糕的功能。 @templatetypedef,這是標準明確允許的嗎? –

1
std::string m_getY(char* p_msg) 
{ 
    return std::string(p_msg); 
} 

template<typename U> 
std::string m_getY(U* p_msg) 
{ 
    return p_msg->blah(); 
} 

不會互相沖突(與前者後者的一個特例,因爲它不是一個模板)