c++ - 使用模板和 vector 时出现编译错误

标签 c++ templates vector 64-bit codeblocks

<分区>

我被告知要编写一个函数,该函数将允许向其提供任何数据类型的 vector 并返回两个 vector 的交集(只需要很少的错误处理,这让我很不爽,但没关系)。为了处理这个问题,我编写了以下 vectorHelper.h 头文件:

template <typename t>
std::vector<t> intersect( const std::vector<t> & v1, const std::vector<t> & v2);

以下 vectorHelper.cpp 文件:

#include <cmath>
#include <vector>
#include "vectorHelper.h"

using namespace std;

template <typename t>

vector<t> intersect( const vector<t> & v1, const vector<t> & v2)
{
    vector<t> results;
    for (int i=0; i<v1.size(); i++)
    {
        for (int j=0; j<v2.size(); j++)
        {
            if (v1[i] == v2[j])
            {
                results.push_back(v1[i]);
                break;
            }
        }
    }
    return results;
}

和下面的 main.cpp 文件来运行该方法:

#include <iostream>
#include <string>
#include <limits>
#include <vector>
#include "vectorHelper.h"

using namespace std;

int main()
{
    const int CAPACITY = 5;
    vector<string> v1;
    vector<string> v2;
    string input;

    cout << "Enter five strings for vector 1: ";
    for (int i=0; i<CAPACITY; i++)
    {
        cin >> input;
        v1.push_back(input);
    }

    cin.ignore(INT_MAX, '\n');
    cout << "\n";

    cout << "Enter five strings for vector 2: ";
    for (int i=0; i<CAPACITY; i++)
    {
        cin >> input;
        v2.push_back(input);
    }

    vector<string> results = intersect(v1, v2);
    cout << "The common strings ( the intersection ): ";
    for (int k=0; k<results.size(); k++)
        cout << results[k] << " ";
}

在 Code::Blocks 中构建和运行会出现以下错误:

g++  -o bin/Debug/Problem3 obj/Debug/main.o obj/Debug/vectorHelper.o    
Undefined symbols for architecture x86_64:
  "std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > intersect<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)", referenced from:
  _main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

我的同学在他们自己的机器上编译了类似的程序(我们都在 MacBook Pro 上运行 Mac OSX 10.8.2),但是当给定我的项目时,他们在他们的机器上得到了同样的错误。因此,我最初认为我安装了一些 Code::Blocks 错误已被“证明”(可能)。最终,我需要程序在 32 位机器上的 Code::Blocks 中编译和运行。有谁知道如何解决这些错误?

原始帖子之前的更新: 我刚找到 this question那就是说模板需要在头文件中完全定义。但是,我的同学们似乎并不受此限制。在头文件中定义我的模板确实解决了这个问题,但是否有一些方法不需要这样做?

最佳答案

显然,模板必须(很可能)在声明它们的同一个文件中定义,因为编译器需要在构建模板之前查看定义和用于填充模板的特定类型。

<template Foo>
//must be in same file as...
Foo<int>

将我的模板定义移动到头文件中解决了所有错误,我能够成功运行该程序。

关于c++ - 使用模板和 vector 时出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14803788/

相关文章:

c++ - 将 Platform::Array<byte> 转换为字符串

c++ - 另一个字符串文字,UDL 迷宫

c++ - 使用 ffmpeg 库将 .264 转换为 .ts

c++ - 检查字符串是否包含子字符串,不管大小写

python - django 模板不呈现

c++ - 带有模板函数名的可变参数模板

c++ - 模板类的 vector ?

c++ - 类中的 std::vectors

javascript - Vue - 部分模板

具有矩阵和向量的 R 循环 : better (faster) solutions?