9

我的构造函数有问题,它没有像我预期的那样工作。

如果我尝试像这样初始化我的类,它将起作用并且我得到一个可用的对象:

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

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

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

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

所以我想知道为什么会这样?第二次申报违法吗?

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

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

};
4

1 回答 1

26
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>());
            ^~~~~~~~~~~~~~~~~
于 2011-03-19T18:07:43.940 回答