【问题标题】:Dependent template parameters依赖模板参数
【发布时间】:2011-11-02 01:39:58
【问题描述】:

我的模板化函数有两个模板参数(int mint n)。该函数返回一个类Foo<int r>,我想要r=m+n

在 foo.h 我有:

template<int m> class Foo {};
template<int m, int n>
Foo<m+n> myFunc(const Foo<m> &a, const Foo<n> &b);

在 foo.cpp 我有:

Foo<m+n> myFunc(const Foo<m> &a, const Foo<n> &b)
{
    return Foo<m+n>();
}

最后在 main.cpp 中:

#include "foo.h"
int main()
{
    myFunc(Foo<2>(), Foo<3>());
}

如果我尝试这个,我会得到一个链接器错误。:

 "undefined reference to `Foo<(2)+(2)> myFunc(Foo<2> const&, Foo<2> const&)'

编辑:已编辑以包含完整的代码。也许不太清楚,但有些人更喜欢。

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    从您提供的少量信息来看,该错误表明尽管您已声明该函数,但您并未在链接器可以看到的任何地方提供实现。

    【讨论】:

      【解决方案2】:

      您可能将函数体代码放在错误的位置。对于(非专门的)模板函数,您通常希望将整个函数体放在头文件中,而不要放在源文件中,否则编译器无法生成代码调用时的那个函数。

      【讨论】:

      • 如果不是这样,我的 VC 在更新 Intellisense 时可能不会停止 (49) .... (48) ....
      【解决方案3】:

      那是因为您还没有定义函数,或者定义在实例化时对编译器不可见。如果你写一个函数体,它就可以工作:

      template <int> class Foo {};
      
      template<int m, int n>
      Foo<m+n> myFunc(const Foo<m> &a, const Foo<n> &b) {} // NOTE: Body.
      
      int main () {
          myFunc (Foo<1>(), Foo<2>());
      }
      

      (旁注:请下次发布完整代码)

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        相关资源
        最近更新 更多