2013-02-10 68 views
0

我已經被告知寫一個函數,它將允許任何給定的向量數據類型並返回兩個向量的交集(很少需要錯誤處理,哪種類型的克服我,但沒關係)。爲了解決這個問題,我寫了下面的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的bug,可能是「反證」(可能)。最終,我需要該程序在32位機器上編譯和運行Code :: Blocks。有誰知道如何解決這些錯誤?

之前更新原始帖子: 我剛剛發現this question,說模板需要在頭文件中完整定義。但是,我的同學似乎並不受限於此。在頭文件中定義我的模板確實解決了這個問題,但是有沒有辦法解決這個問題?

+0

可能會有幫助閱讀:http://www.parashift.com/c++-faq/templates-defn-vs-decl.html – JaredC 2013-02-10 23:19:50

+0

*「但是,我的同學似乎並沒有受到限制。頭文件中的模板確實解決了這個問題,但是有沒有不需要的方法?「 - 你的同學沒有一個特殊的編譯器,它可以神奇地推導出模板類型/函數的實現。這是使用模板的基本規則。 – 2013-02-10 23:22:15

+0

@billz對不起,我沒有看到這個問題。感謝指針。 – 2013-02-10 23:30:49

回答

1

很明顯,模板必須(很可能)在聲明的同一個文件中定義,因爲編譯器需要在構建模板之前查看定義和用於填充模板的特定類型。

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

將我的模板定義移動到頭文件中解決了所有錯誤,我能夠成功運行程序。