2011-06-15 92 views
1

可能重複:
Can the template parameters of a constructor be explicitly specified?模板的構造函數的怪事

我以前question跟進,(我發現這個情況,編輯2)

特出簡單的代碼:

#include <iostream> 

struct Printer 
{ 
    Printer() { std::cout << "secret code" << std::endl; } 
}; 

template <class A> 
struct Class 
{ 
    template <class B, class C> 
    Class(B arg) 
    { 
     C c; /* the 'secret code' should come from here */ 
     std::cout << arg << std::endl; 
    } 

    Class(double arg) { std::cout << "double" << std::endl; } 
    Class(float arg) { std::cout << "float" << std::endl; } 

    /* this forbids the use of printer in the first parameter */ 
    Class(Printer printer) { throw std::exception(); /* here be dragons */ } 
}; 

int main() 
{ 
    Class<int> c(1.0f); 
    Class<int>* ptr = new Class<int>((double)2.0f); 
    return 0; 
} 

// Can anyone print 'secret code' while creating an object of type 'Class' ? 

詳細說明:對於模板構造函數,您可以在對象被實例化時指定一個不屬於構造函數參數一部分的模板參數嗎?

我認爲這是值得一個問題。

回答

2

不,這是不可能的。

沒有語法可用於向構造函數模板提供顯式模板參數。您只能爲整個類模板提供顯式的模板參數。

以下來自[temp.arg.explicit](2003措辭,14.8.1/5)的案文涵蓋了該場景。雖然該條款不規範,它用來解釋給我們的是,作爲語法的固有限制,這是不可能的:

注:由於顯式模板 參數列表如下功能 模板名稱和因爲轉換 成員函數模板和 構造成員函數模板 被稱爲不使用功能 名沒有辦法提供的 顯式模板參數列表這些功能模板

這部分來自於您從未實際上明確調用構造函數的事實。當你編寫代碼時,比如A(),即使看起來好像你是在調用構造函數(「轉換成員函數模板和構造函數成員函數模板,但沒有使用函數名稱」),你並沒有像調用函數那樣調用構造函數。

+0

我傾向於同意,但是當這個問題最後進行了辯論時,所有明確的是標準本身並不是很清楚。 – 2011-06-15 14:15:21

+0

@詹姆斯:我不關注。 'int'有一個類模板參數,不是? – 2011-06-15 14:16:24

+0

@Tomalak是的。當我點擊發送按鈕時,我意識到自己的錯誤,並編輯了我的回覆以刪除錯誤的部分。 – 2011-06-15 14:17:22

0

我認爲他想知道如何用C實例化這個類爲SOMETYPE:

template<typename A> 
class foo 
{ 
    template<typename B, typename C> 
    foo(B b) 
    { 
     C c; 
    } 
}; 

我不知道這是可能的。

+1

答案是否定的,不是。 – 2011-06-15 14:10:03