0

与えられた任意のデータ型のベクトルを許可し、2つのベクトルの共通部分を返す関数を作成するように言われました(エラー処理はほとんど必要ありませんでした。これは私を苛立たせますが、気にしないでください)。これを処理するために、次の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

私のクラスメートは自分のマシンで同様のプログラムをコンパイルしましたが(私たちはすべてMacBookProでMacOSX 10.8.2を実行しています)、私のプロジェクトを与えられたとき、彼らは自分のマシンで同じエラーを受け取ります。したがって、Code :: Blocksのバグをインストールしたと最初に思ったのは、(おそらく)「反証」されたということです。最終的には、32ビットマシンのCode::Blocksでコンパイルして実行するプログラムが必要です。誰かがこれらのエラーを修正する方法を知っていますか?

元の投稿の前に更新:テンプレートをヘッダーファイルで完全に定義する必要があるというこの質問を見つけました。しかし、私のクラスメートはそのように制限されていないようです。ヘッダーファイルでテンプレートを定義すると問題は解決しますが、それを必要としない方法はありますか?

4

1 に答える 1

1

明らかに、テンプレートは(おそらく)宣言されたものと同じファイルで定義する必要があります。コンパイラーは、テンプレートをビルドする前に、定義と、テンプレートに入力する特定のタイプを確認する必要があるためです。

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

テンプレート定義をヘッダーファイルに移動すると、すべてのエラーが解決され、プログラムを正常に実行できました。

于 2013-02-10T23:33:53.773 に答える