2011-03-19 44 views
7

我有一个构造函数的问题,它不像我所期望的那样工作。构造函数不返回可用对象

如果我尝试初始化我的课一样,它会工作,我得到一个可用的对象:

vector<float> v; 
MyClass<2> a(v); 

但是,如果我尝试建立类似下面的一类(这应该是等同)的结果是非常意外的。编译或运行程序时没有错误消息/警告。但是如果你试图在某个地方使用这个变量并调用它的方法(例如a.doSomething()),它会崩溃。

我在构造函数里面放了一些代码来通知我它是否被使用。事实证明,在这种情况下,构造器中没有实际执行代码。

MyClass<2> a(vector<float>()); 

所以我想知道为什么会发生这种情况?第二个声明是非法的吗?

编辑:我会发布一些类的代码

template <int x> 
class MyClass { 
public: 
    vector<float> v; 
    MyClass<x>(vector<float> v1) { 
     v = v1; 
    } 

}; 
+0

The clas s有一个相同类型的公共变量。所以它只会将参数分配给变量。 – dominos 2011-03-19 17:57:59

+0

发布MyClass的一些代码! – Nawaz 2011-03-19 17:59:16

+0

我发布了一些类的代码。它不是一个引用或指针,只是一个变量。 – dominos 2011-03-19 18:04:30

回答

18
MyClass<2> a(vector<float>()); 

这不是一个变量声明。它是一个名为a的函数的声明,它返回一个MyClass<2>对象,并将一个“指向不带参数并返回vector<float>的函数的指针作为参数”。混乱?是。这就是所谓的“最令人头痛的解析”。

你需要额外的括号:

MyClass<2> a((vector<float>())); 
      ^   ^

或者,您可以使用拷贝初始化:

MyClass<2> a = MyClass<2>(vector<float>()); 

或者,因为你的构造是不是explicit,你可以使用:

MyClass<2> a = vector<float>(); 

(虽然,除非你的意思是vector<float>对象被隐式转换竹叶提取MyClass<N>对象,你可能想使这个构造explicit。)


一个好的编译器应该警告你这样的事情。 VISUAL C++警告:

警告C4930: 'MyClass<x> a(std::vector<_Ty> (__cdecl *)(void))':不叫原型函数(是一个变量定义的吗?)

锵警告:

警告:括号中消除歧义的函数声明器

MyClass<2> a(vector<float>()); 
      ^~~~~~~~~~~~~~~~~ 
+0

为什么MyClass <2> a((向量()))?这不应该像MyClass <2> a(矢量())? – BlackBear 2011-03-19 18:10:19

+0

@BlackBear:使用额外的括号,它不是一个有效的函数声明,所以它被解析为具有直​​接初始化器的变量声明。 – 2011-03-19 18:14:31

+0

明白了。谢谢:) – BlackBear 2011-03-19 18:16:37

相关问题