【问题标题】:Non-member static templated method definitions in C++?C ++中的非成员静态模板方法定义?
【发布时间】:2010-10-23 20:05:06
【问题描述】:

我可以从静态成员函数调用非成员静态模板函数,其中定义被拆分为 header 和 cpp:

// zero.cpp

class Zero
{
    static void zero() { one(5); }
};

// one.h

template <typename T>
static void one(T& var);

// one.cpp

template <typename T>
void one(T& var) { }

// main.cpp

...

Zero::zero()

...

我在获取此链接时遇到问题,我不断收到对我试图在 one.cpp 中定义的函数的未定义引用。

最初我认为这是由于命名空间的问题,但现在所有文件都在同一个命名空间中。我在这里做错了什么吗?

【问题讨论】:

  • 这是一百万次的重复,但是在实际查找内容方面确实很糟糕。愚蠢的 SO 搜索。

标签: c++ templates linker static-methods


【解决方案1】:

模板定义需要在实例化时可见。也就是说,它需要以某种方式出现在标题中:

// one.hpp

template <typename T>
static void one(T& var)
{
    // definition visible in header
}

虽然我不确定你为什么希望它是静态的。

【讨论】:

  • 当然是的,我总是对此感到困惑。如果定义在另一个头文件中仍然可用,我可以在一个头文件中转发声明模板化函数。你是对的,在这种情况下没有理由保持静止。
【解决方案2】:

作为对 GMan 答案的补充,我想指出,您不能将 T&amp; 绑定到右值,例如整数文字 5,它的类型为 int。 5 不会绑定到int&amp;,但会绑定到const int&amp;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多