2017-01-19 53 views
1

我正在學習C++模板技術。如何在C++中調用variadic模板構造函數?

我做了一個構造函數variadic模板補充如下。

該課程非常簡化,所以它沒有意義。 但是我無法調用該函數。編譯器告訴我它不能直接調用構造函數。

我該怎麼稱呼它?

#include <utility> 

class TemplateVariadicAugments { 
public: 

    template <typename FutureInnterTemplateClass, typename... Args> 
    TemplateVariadicAugments(Args&&... args) : value_(std::forward<Args>(args)...) {} 

    virtual ~TemplateVariadicAugments() = default; 

    int value_; 
}; 

void test_variadic_template_augments(void) { 

    TemplateVariadicAugments a = TemplateVariadicAugments::template TemplateVariadicAugments<int, int>(1); 

} 
+0

'TemplateVariadicAugments a {1};'? – Danh

+0

@Danh:謝謝你的回答。我試過了,但沒有奏效。 – mora

回答

2

在你寫的表單中,沒有辦法調用構造函數。首先,在C++中,不能被它的名字調用構造函數,即使在簡單的情形:

class A 
{ 
public: 
    A() {} 
}; 

void foo() 
{ 
    A::A(); // Illegal. 
} 

然後,當你不能直接調用構造函數,你不能顯式實例化的模板,因此所有的模板參數必須被推斷。但在你的情況下,FutureInnterTemplateClass不能被推斷,因爲它沒有在構造函數的任何地方使用。

的解決方案是從構造刪除冗餘參數:

template <typename... Args> 
TemplateVariadicAugments(Args&&... args) : value_(std::forward<Args>(args)...) {} 

現在,一個對象可以被構造如下:在這種情況下

TemplateVariadicAugments obj(1); 

Args港島線LBE正確地推斷爲int

但在這種情況下,它是什麼?你想與可變參數模板參數說,因爲如果你構建一個這樣的對象是不清楚:

TemplateVariadicAugments obj(1, 2); 

value_成員初始化將成爲相當於TI這樣的代碼:

int value_(1, 2); 

這顯然是不合格的。

相關問題