2016-11-23 54 views
4

我正在寫一個模板函數,我想將一個模板變量初始化爲零。我想設置的變量等於零,然後讓類類型定義自己的「零」的定義:允許類被分配爲零

T data = 0; 

我試圖重載賦值運算符:

class Example{ 
public: 
    int data; 
    Example(){} 
    Example& operator=(int v){ 
     data = v; 
     return *this; 
    } 
}; 

template <class T> T test(){ 
    T data = 0; 
    return data; 
} 

int main(int argc, char** argv){ 
    double v1 = test<double>(); 
    Example v2 = test<Example>(); 
    return 1; 
} 

...但編譯器給我「錯誤:從'int'轉換爲非標量類型...」。我該如何做這項工作?還是有更好的方式來做我想做的事情?

+2

也許你想要一個'int'作爲參數的構造函數。 –

+0

這聽起來像你應該真的[值初始化](http://en.cppreference.com/w/cpp/language/value_initialization)該變量,而不是將其設置爲零。 (另外,'T data = 0;'試圖從'0'構造'data',而不是將'0'分配給'data',這很讓人困惑。) – user2357112

+0

嗯,好吧,我沒有意識到構造函數的語法工作原語。 – Azmisov

回答

2

您的代碼存在的問題是T data = 0;實際上調用的是構造函數,而不是operator=。所以爲了讓代碼正常工作,你需要聲明一個接受int的構造函數。

0

你應該注意到你的類可以指定爲0。你應該用括號初始化:

template <class T> T test(){ 
    T data{}; 
    return data; 
} 

它會正確地構建任何缺省構造的類型和零將初始化內置類型,如doubleint