2014-12-02 85 views
0

這下不工作:爲什麼在模板參數中不允許使用類型對象?

// case one: 

struct MyClass { 
    int x; 
}; 

template <MyClass name> 
void foo() { 
} 

但是,如果我在此引用它的工作原理:

// case two: 

struct MyClass { 
    int x; 
}; 

template <MyClass &name> 
void foo() { 
} 

我需要通過MyClass的的不斷對象將其與類工作如果一個?

+0

爲什麼你需要在這種情況下,在所有的模板? – 2014-12-02 12:20:10

+0

@πάνταῥεῖ:我在問它爲什麼不被允許的原因..如果你可以評論它,請問問題已經關閉。就像我知道模板是在編譯時推導的,但是類對象究竟是一個問題呢? – user963241 2014-12-02 13:23:06

+0

副本中的第二個答案非常好地描述了爲什麼不允許使用類類型與類的指針或引用。 – 2014-12-02 14:15:29

回答

1

看起來你想要專門化一個模板?

也許這就是你想要的?

template <typename T> 
void foo(const T& param){ 
    cout << reinterpret_cast<const int&>(param) << endl; 
} 

template <> 
void foo(const MyClass& param) { 
    cout << param.x << endl; 
} 

int main() { 
    MyClass bar = {13}; 

    foo(42L); // Outputs 42 
    foo(bar); // Outputs 13 

    return 0; 
} 

(請注意:reinterpret_cast是高度懷疑,我只是用它的例子在這裏。)

+0

不,我只想知道如果我使用類對象而不是對它的引用會出錯。它是否需要處理,因爲模板是在編譯時推導出來的?究竟如何? – user963241 2014-12-02 13:24:35

+0

@ user963241啊,所以你在這裏創建一個[「函數模板」](http://en.wikipedia.org/wiki/Template_%28C%2B%2B%29#Function_templates)。 「使用類型參數聲明函數模板的格式是:'template function_declaration'或'template function_declaration'您選擇'identifier',但定義的其餘部分必須遵循這種格式'template 不符合該格式。 – 2014-12-02 13:31:04

相關問題