c++ - 在模板化类中,如何定义具有不同类型名称的函数

标签 c++ templates g++

编辑:这不是标准模板问题的拷贝。

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

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

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


我过于简化的代码:

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
}

咕.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> >&)

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

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

什么是正确的语法?

最佳答案

您的问题不在声明或定义中。问题是定义和声明的 split 。你这样做是行不通的。编译 foo.cpp 时,看不到模板的使用,因此不会创建任何实例。编译 goo.cpp 时,链接器将因此无法链接到它们。

这就是这个错误的意思:

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

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

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>&);

关于c++ - 在模板化类中,如何定义具有不同类型名称的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46039261/

相关文章:

c++ - 返回 NULL 与返回没有数据的对象

c++ - Reduce 函数计算每列的总和

c++ - 将代码从 gcc 移植到 clang

c++ - 可以在编译时隐式引用类名吗?

python - fatal error : numpy/arrayobject. h:没有那个文件或目录

c++ - 从不同的线程获取用户输入

c++ - : expected constructor,析构函数错误,或者 '=' toke之前的类型转换

C++ 无法选择正确的部分模板特化

c++ - SQL Server 2017 C++ ODBC 连接在 Linux 上不工作

c++ - typeid() 在 g++ 中返回额外的字符