2

バイナリデータを読み取って構造体をメモリにロードし直そうとしているので、それらを編集して.datファイルに保存し直すことができます。

readVector()はファイルの読み取りを試み、シリアル化されたベクターを返します。しかし、実行しようとすると、このコンパイルエラーが発生します。テンプレートの何が問題になっていますか?

********* 編集 ******************

コード:

// Project 5.cpp : main project file.

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace System;
using namespace std;
#pragma hdrstop

int checkCommand (string line);

template<typename T>
void writeVector(ofstream &out, const vector<T> &vec);

template<typename T>
vector<T> readVector(ifstream &in);

struct InventoryItem {
    string Item;
    string Description;
    int Quantity;
    int wholesaleCost;
    int retailCost;
    int dateAdded;
} ;


int main(void)
{
    cout << "Welcome to the Inventory Manager extreme! [Version 1.0]" << endl;

    ifstream in("data.dat");

    vector<InventoryItem> structList;

    readVector<InventoryItem>( in );

    while (1)
    {

        string line = "";

        cout << endl;
        cout << "Commands: " << endl;
        cout << "1: Add a new record " << endl;
        cout << "2: Display a record " << endl;
        cout << "3: Edit a current record " << endl;
        cout << "4: Exit the program " << endl;
        cout << endl;
        cout << "Enter a command 1-4: ";

        getline(cin , line);


        int rValue = checkCommand(line);
        if (rValue == 1)
        {
            cout << "You've entered a invalid command! Try Again." << endl;
        } else if (rValue == 2){ 
            cout << "Error calling command!" << endl;
        } else if (!rValue) {
            break;
        }
    }


    system("pause");

    return 0;
}

int checkCommand (string line)
{
    int intReturn = atoi(line.c_str());
    int status = 3;

    switch (intReturn)
    {
        case 1:
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            status = 0;
            break;
        default:
            status = 1;
            break;
    }
    return status;
}

template<typename T>
void writeVector(ofstream &out, const vector<T> &vec)
{
    out << vec.size();

    for(vector<T>::const_iterator i = vec.begin(); i != vec.end(); i++)
    {
        out << *i;
    }
}

ostream& operator<<(std::ostream &strm, const InventoryItem &i) {
  return strm << i.Item << " (" << i.Description << ")";
}


template<typename T>
vector<T> readVector(ifstream &in)
{
    size_t size;
    in >> size;

    vector<T> vec;
    vec.reserve(size);

    for(int i = 0; i < size; i++)
    {
        T tmp;
        in >> tmp;
        vec.push_back(tmp);
    }

    return vec;
}

コンパイラエラー:

1>------ Build started: Project: Project 5, Configuration: Debug Win32 ------
1>Compiling...
1>Project 5.cpp
1>.\Project 5.cpp(124) : warning C4018: '<' : signed/unsigned mismatch
1>        .\Project 5.cpp(40) : see reference to function template instantiation 'std::vector<_Ty> readVector<InventoryItem>(std::ifstream &)' being compiled
1>        with
1>        [
1>            _Ty=InventoryItem
1>        ]
1>.\Project 5.cpp(127) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'InventoryItem' (or there is no acceptable conversion)
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(1144): could be 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,signed char *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(1146): or       'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,signed char &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(1148): or       'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,unsigned char *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(1150): or       'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,unsigned char &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(155): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::basic_istream<_Elem,_Traits> &(__cdecl *)(std::basic_istream<_Elem,_Traits> &))'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(161): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(168): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::ios_base &(__cdecl *)(std::ios_base &))'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(175): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::_Bool &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(194): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(short &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(228): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(unsigned short &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(247): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(int &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(273): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(unsigned int &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(291): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(long &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(309): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(__w64 unsigned long &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(329): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(__int64 &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(348): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(unsigned __int64 &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(367): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(float &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(386): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(double &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(404): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(long double &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(422): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(void *&)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(441): or       'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::operator >>(std::basic_streambuf<_Elem,_Traits> *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        while trying to match the argument list '(std::ifstream, InventoryItem)'
1>Build log was saved at "file://c:\Users\Owner\Documents\Visual Studio 2008\Projects\Project 5\Project 5\Debug\BuildLog.htm"
1>Project 5 - 1 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

なんてこった...私はそのエラーを修正したと思いますが、今は別のエラーが発生しました。これについても私を助けてくれませんか!これは一体どういう意味ですか?

4

4 に答える 4

6
readVector( in ); // error C2783

これは次のようになります。

readVector<InventoryItem>( in ); 

引数依存のルックアップはテンプレートの推測に役立たないため、明示的な指定が必要です。

in >> tmp;

この行には、次のような関数が必要です。

istream& operator>>(ostream& is, InventoryItem& item) {
    // parse and read in the data to item
    return is;
}

定義を入れてください(私はstragerがあなたの他の質問でこれを提供したと思います)。

于 2009-04-02T06:50:34.800 に答える
2

readVectorを呼び出すと、通常、パラメーターからテンプレート引数を推測しようとします。

あなたの例では、テンプレート化された部分は戻り値だけなので、暗黙的にそれを理解する方法はありません。

電話を変更する

readVector(in)

vector<InventoryItem> structList = readVector<InventoryItem>(in);
于 2009-04-02T06:51:31.367 に答える
2

何が起こっていると思うのは、 ofstream が構造体をシリアル化する方法を知らないということです。

InventoryItem に対して >> および << 演算子を定義する必要がある場合があります。

ofstream& operator << ( ofstream& ofs, InventoryItem& );
ifstream& operator >> ( ifstream& ifs, InventoryItem& );

編集::

これは完全に機能する例です。編集前は、ifstream で少しずれていました。

#include < iostream >
#include < fstream >
#include < string >

struct InventoryItem{
    std::string name;
    int id;
    float price;
};

using std::ofstream;
using std::ifstream;

ofstream& operator << (ofstream& ofs, InventoryItem& ii)
{
    ofs << ii.name << std::endl 
        << ii.id << std::endl
        << ii.price << std::endl;
    return ofs;
}

ifstream& operator >> ( ifstream& ifs, InventoryItem& ii )
{
    ifs >> ii.name >> ii.id >> ii.price;
    return ifs;
}

void printItem(const InventoryItem& ii)
{
    std::cout << "Name: " << ii.name << std::endl
        << "ID: " << ii.id << std::endl
        << "Price: " << ii.price << std::endl;
}

int main()
{
    ofstream outfile("testout.txt");
    InventoryItem list[] = { {"Item1", 1, 1.5}, {"Item2", 2, 2.5} };

    outfile << list[0] << list[1];
    outfile.close();

    std::ifstream infile("testout.txt");
    InventoryItem list2[2]; 

    infile >> list[0] >> list[1];

    printItem(list[0]);
    printItem(list[1]);

    return 0;
}

予想される出力は次のとおりです。

    名前: アイテム1
    ID: 1
    価格: 1.5
    名前: アイテム 2
    ID: 2
    価格: 2.5
于 2009-04-02T07:02:43.040 に答える
0

このエラーは、コンパイラがテンプレート引数の型を解決できない場合に発生します。

これが私のコードの例です:

template QSP<VarDataInterface<qint64>> VarDataManager::interpolateFromDB( 
const DBWrapper & _db, const QString &variablePath, const QString &_unit, 
const DBWrapper * _dbRef /*= nullptr*/, 
const QString &refPath /*= QString::null*/, 
const QString &_unitRef /*= QString::null*/ );

template QSP<VarDataInterface<QString>> VarDataManager::interpolateFromDB( 
const TA5::IDBWrapper & _db, const QString &variablePath, 
const QString &_unit, const TA5::IDBWrapper * _dbRef /*= nullptr*/, 
const QString &refPath /*= QString::null*/, const QString &_unitRef /*= QString::null*/ );

template< class TYPE >
QSP<VarDataInterface<TYPE>> VarDataManager::interpolateFromDB( 
const DBWrapper & _db,   const QString &variablePath, const QString &_unit, 
const DBWrapper * _dbRef /*= nullptr*/, 
const QString &refPath /*= QString::null*/, 
const QString &_unitRef /*= QString::null*/ )
{
    const Header dbVar = _db.getDatabaseVariable( variablePath );

    if( !dbVar.isValid() )
        return QSP<VarDataInterface<TYPE>>(nullptr);

    TVariableHeader dbVarRef;
    if( _dbRef != nullptr )
    {
        //
    }
    else
    {
        //
    }

     return QSP<VarDataInterface<TYPE>>();
}

ここで使用:

最初の試みで、私はこれを書きました

m_Var = VarDataManager::interpolateFromDB(VarDataManager::getMainDB(), treeitem->text(0), QString::null, nullptr, QString::null, QString::null);

エラーC2783が発生しました。これで解決

m_Var = VarDataManager::interpolateFromDB<double>(VarDataManager::getMainDB(), treeitem->text(0), QString::null, nullptr, QString::null, QString::null);

HTH

于 2013-05-07T13:11:06.337 に答える