我被告知编写一个函数,允许给它的任何数据类型的向量并返回两个向量的交集(需要非常少的错误处理,这让我感到烦恼,但没关系)。为了解决这个问题,我编写了以下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表示需要在头文件COMPLETELY中定义模板。但是,我的同学似乎并没有受到限制。在头文件中定义我的模板确实可以解决问题,但是有哪些方法不需要它?
答案 0 :(得分:1)
显然,模板必须(很可能)在声明它们的同一文件中定义,因为编译器需要查看定义以及在构建模板之前填充模板的特定类型。
<template Foo>
//must be in same file as...
Foo<int>
将模板定义移动到头文件中解决了所有错误,我能够成功运行程序。