2016-11-23 62 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