2

我试图为方法(或构造函数)参数的默认值强加某种语义逻辑。这是我尝试过的:

#include <iostream>
#include <vector>
class Test
{
public:
    static const std::vector<int> staticVector;
    Test (const std::vector<int> &x = Test::staticVector) {}
};

int main ()
{
    Test x;

    return 0;
}

尽管 staticVector 相当多余,但由于 C++ 不允许将 NULL 作为 std::vector 的实例传递,我希望避免对构造函数 std::vector() 进行冗余调用,所以我想出了这种方法。 .

不幸的是,当我尝试编译它时,链接器会抛出这个错误:

error LNK2001: unresolved external symbol "public: static class std::vector<int,class std::allocator<int> > const Test::staticVector" (?staticVector@Test@@2V?$vector@HV?$allocator@H@std@@@std@@B)

我在这里想念什么?

4

2 回答 2

6

这实际上与使用默认参数无关。相反,它是静态变量在 C++ 中如何工作的副作用。

在 C++ 类中拥有静态对象是一个两步过程。首先,您必须声明已完成的静态对象,但随后您必须在某处实际定义它,以便 C++ 知道哪个翻译单元应包含该静态对象的一个​​定义。你可以通过写来做到这一点

const std::vector<int> Test::staticVector;

类之外的 C++ 源文件中的某个位置。这告诉 C++ 你的源文件包含这个对象的定义,它应该解决链接器错误。

如果您有多个不同的源文件而不仅仅是一个,那么您应该将此行放在Test类的源文件中,而不是放在标题中。

希望这可以帮助!

于 2012-06-13T00:59:00.787 回答
1

您已经声明了静态成员,但没有定义它。课后你需要类似的东西:

 const std::vector<int> Test::staticVector;

You may want to initialise it with some value depending on what you'rre really planning on doing with it.

于 2012-06-13T01:11:47.217 回答