【问题标题】:In a templated class, how do I define a function with a different typename在模板类中,如何定义具有不同类型名的函数
【发布时间】:2017-09-04 14:32:44
【问题描述】:

编辑:不是标准模板问题的副本。

我的场景涉及一个模板化类和该类的成员函数,其中一个参数是模板化的,但与该类的类型不同。

即使我将定义放在标题中,我仍然找不到正确的语法。

有人可以帮我解决我的具体问题吗?


我过于简化的代码:

Foo.h:

template<typename T1>
class Foo {
public:
    template<typename T2>
    static void bar(vector<T1>& a, vector<T2>& b);
};

Foo.cpp:

#include <Foo.h>

template<typename T1>
template<typename T2>
void Foo<T1>::bar(vector<T1>& a, vector<T2>& b) {
    //code logic
}

Goo.cpp:

#include <Foo.h>

int main(int argc, char** argv) {
    vector<int> a;
    vector<double> b;
    Foo<int>::bar(a, b);
}

我的错误:

undefined reference to
void Foo<int>::bar<double>(std::vector<int, std::allocator<int> >&, 
std::vector<double, std::allocator<double> >&)

我找不到定义模板的正确方法。

我还注意到类型名的顺序会改变错误(也将整个函数放在类声明中)。

正确的语法是什么?

【问题讨论】:

  • 为什么你认为这不是重复的?您不能在源文件中定义模板。 “即使我将定义放在标题中,我仍然找不到正确的语法。” ...那你为什么不在标题中显示带有定义的代码呢?
  • 如果你edit的问题是向我们展示头文件中定义的模板化成员函数的代码,我们可以重新打开它。感谢您简化代码 - 请确保编辑后的简化版本仍然失败,并包含错误消息。 (如果你在评论中@-提到我,我想我可以单枪匹马地重新打开它。)
  • 您的 Foo.h 有错字和缺少分号。请仅复制和粘贴您实际尝试编译并验证您收到声明的错误消息的代码。

标签: c++ templates g++


【解决方案1】:

您的问题不在于声明或定义。问题是定义和声明的分裂。这不像你那样工作。在编译foo.cpp 时,您的模板的使用是不可见的,因此不会创建任何实例。在编译goo.cpp 时,链接器将无法链接到它们。

这就是这个错误的意思:

对 'void Foo::bar(std::vector >&, std::vector 的未定义引用>&)'

如果你真的想做你正在做的事情,你需要对每种类型的组合使用显式实例化。

foo.cpp改成这个(注意最后一行的显式实例化定义):

template<typename T1>
template<typename T2>
void Foo<T1>::bar(std::vector<T1>& a, std::vector<T2>& b) {
    //code logic
}

template void Foo<int>::bar(std::vector<int>&, std::vector<double>&);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多