我有以下小代码:
template <typename T>
class V
{
public:
T x;
explicit V(T & _x)
:x(_x){}
};
int main()
{
V<float> b(1.0f); // fails
return 0;
}而它碰巧失败了。g++ 4.4.5返回的消息是:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"
../main.cpp: In function ‘int main()’:
../main.cpp:19: error: no matching function for call to ‘V<float>::V(float)’
../main.cpp:10: note: candidates are: V<T>::V(T&) [with T = float]
../main.cpp:6: note: V<float>::V(const V<float>&)
问题是..。第二个构造函数是从哪里来的?我真的不知道..。
发布于 2010-10-08 04:49:58
其他的答案会讨论为什么会出现编译时失败(这是大多数问题的主要问题,当这些失败是问题中最突出的部分时)。然而。关于您的明确问题,“第二个构造函数从何而来?”:
12.8/4标准的“复制类对象”说:
如果类定义没有显式声明副本构造函数,则将隐式声明一个副本构造函数。
如果您想避免使用隐式复制器,可以使用少数几个“不可复制”成语中的一个(如boost::noncopyable):http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-copyable_Mixin。
发布于 2010-10-08 04:51:44
编译器已经向类提供了一个复制构造函数和赋值操作符。它试图将复制构造函数与main中的语句匹配。这段代码的问题在于,在类V的构造函数中,您将参数作为非const引用。当您执行V<float> b(1.0f)时,编译器将为值1.0f创建一个类型为float的未命名临时变量。但是,这个未命名的临时引用不能绑定到非const引用,它只能绑定到const引用。因此,您需要将构造函数签名更改为explicit V(const T & _x)。
https://stackoverflow.com/questions/3887759
复制相似问题