天道酬勤,学无止境

错误:使用 boost::serialisation 没有匹配 'operator<<'(error: no match for 'operator<<' using boost::serialisation)

问题

我正在尝试让一些(迄今为止)Windows 代码在 unix 机器上编译,但在以下方法中遇到一些错误:

namespace EDIN {
    void World::Save(char const filename[])                                                  
    {                                                                                        
        std::ofstream ofs(filename);                                                         

        boost::archive::text_oarchive oa(ofs);                                               

        oa << this << cellSequence << report; // line 590: error!
    }
}

错误如下所示:

test.cpp:在成员函数“void EDIN::World::Save(const char*)”中:test.cpp:122:12:错误:“operator<<”不匹配(操作数类型为“boost::archive” ::text_oarchive' 和 'EDIN::World*') oa << this << cellSequence << report; // 第 590 行:错误! ^ test.cpp:122:12:注意:候选文件是:在 /home/armanschwarz/lib/boost_1_55_0/boost/archive/detail/common_oarchive.hpp:22:0 包含的文件中,来自 /home/armanschwarz/lib/boost_1_55_0 /boost/archive/basic_text_oarchive.hpp:32,来自 /home/armanschwarz/lib/boost_1_55_0/boost/archive/text_oarchive.hpp:31,来自 test.cpp:1:/home/armanschwarz/lib/boost_1_55_0/boost/archive /detail/interface_oarchive.hpp:62:15: 注意:存档& boost::archive::detail::interface_oarchive::operator<<(T&) [with T = EDIN::World*; Archive = boost::archive::text_oarchive] Archive & operator<<(T & t){ ^ /home/armanschwarz/lib/boost_1_55_0/boost/archive/detail/interface_oarchive.hpp:62:15:注意:没有已知的转换对于从 'EDIN::World*' 到 'EDIN::World*&' 的参数 1

我正在使用 boost 1.55.0(与我以前在 Visual Studio 上编译时相同)。 谁能发现我在这里做错了什么?

这是来自 sehe 的一个独立示例:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/valarray.hpp>
#include <chrono>

namespace EDIN
{
    struct Region
    {
        int id;
        Region(int id = 42) : id(id) {}

      private:
        friend class boost::serialization::access;
        template<class Archive> void serialize(Archive & ar, const unsigned int file_version)
        {
            ar & id;
        }
    };

    struct Scheme
    {
        std::string GetSchemeType() const { return "scheme_type_42"; }
    };


    class World
    {
        // dummy members to make it compile
        // will be different things of course
        int mass, epoch;
        std::chrono::system_clock::time_point _start;

        std::string report;
      public:
        std::vector<int> cellSequence; // for demo, public

        World(std::string&, EDIN::Region&, unsigned int&, const std::chrono::system_clock::time_point&)
            : mass(99), epoch(88), _start(std::chrono::system_clock::now()), report("Report101")
        {
            // TODO!
        }

        Region       Bounds() const { return Region();       }
        int          Epoch()  const { return epoch;          }
        EDIN::Scheme Scheme() const { return EDIN::Scheme(); }
        std::chrono::system_clock::time_point StartingWallTime() const {
            return _start;
        }

        World()
            : mass(99), epoch(88), _start(std::chrono::system_clock::now()), report("Report101")
        {
        }

        void Save(char const filename[]);
        static World* Load(char const filename[]);

        private:
            friend class boost::serialization::access;
            template<class Archive> void serialize(Archive & ar, const unsigned int file_version)
            {
                ar & mass & epoch;
            }
    };
}

namespace boost
{
    namespace serialization
    {
        template<class Archive>
        inline void save_construct_data(Archive & ar, EDIN::World const * t, unsigned const int file_version)
        {
            time_t const totalRunningTime = std::chrono::duration_cast<std::chrono::duration<time_t, std::milli>>(
                std::chrono::system_clock::now() - t->StartingWallTime()).count();

            EDIN::Region const bounds = t->Bounds();
            time_t const epoch = t->Epoch();

            std::string tmp = t->Scheme().GetSchemeType();
            ar
                << bounds
                << epoch
                << totalRunningTime 
                << tmp;
        }

        template<class Archive>
        inline void load_construct_data(Archive & ar, EDIN::World * t, const unsigned int file_version)
        {
            EDIN::Region bounds;
            unsigned epoch;
            time_t totalRunningTime;
            std::string schemeType;
            ar >>
                bounds >>
                epoch >>
                totalRunningTime >>
                schemeType;

            std::chrono::system_clock::time_point const startingWallTime =
                std::chrono::system_clock::now() - std::chrono::duration<time_t, std::milli>(totalRunningTime);

            ::new(t) EDIN::World(schemeType,bounds,epoch,startingWallTime);
        }
    }
}

#include <fstream>

namespace EDIN {
    void World::Save(char const filename[])
    {
        std::ofstream ofs(filename);

        boost::archive::text_oarchive oa(ofs);

        oa << this << cellSequence << report; // line 590: error!
    }

    World* World::Load(char const filename[])
    {
        World *world = 0;

        std::ifstream ifs("world.save");
        boost::archive::text_iarchive ia(ifs);

        ia >> world;
        ia >> world->cellSequence >> world->report;

        return world;
    }
}

int main()
{
    EDIN::World world;
    world.cellSequence.push_back(12345);
    world.cellSequence.push_back(-6767);
    world.Save("world.save");

    EDIN::World* restored = EDIN::World::Load("world.save");
    restored->Save("world2.save");

    delete restored;
}

它在这里使用 GCC 4.8.1 和 Boost 1.55.0 编译得很好。 我正在使用 GCC 4.9.0 并提升 1.55.0。

编辑:我发现了一个似乎有效的黑客:

问题似乎是 G++ 4.9 不想将World::thisWorld*World*& 。 用以下内容替换World::Save方法可以解决问题:

void World::Save(char const filename[])
{
    std::ofstream ofs(filename);

    boost::archive::text_oarchive oa(ofs);

    World* thisCopy = this;
    oa << thisCopy << cellSequence << report;
}

GCC 4.8.1 和 GCC 4.9 之间的行为似乎存在差异,导致后者无法编译,除非我创建this指针的副本。 如果有人能指出为什么会发生这种情况,以及它是否是一个错误或有意改变的行为,将不胜感激!

回答1

您没有提供所有必要的信息。

这是一个基于您 /did/ 显示的示例代码的独立示例

  • 住在 Coliru

如您所见,它运行良好。 我认为可能会引起麻烦的唯一重要编辑是:

std::string tmp = t->Scheme().GetSchemeType();
ar
    << bounds
    << epoch
    << totalRunningTime 
    << tmp;

// and the following (use of this as mutable reference, which some versions of GCC erronously accepted)

void SaveWorld(World* world, char const filename[])
{
    std::ofstream ofs(filename);
    boost::archive::text_oarchive oa(ofs);
    oa << world << world->cellSequence << world->report; // line 590: error!
}

问题在于要么按值返回,要么const& ,因为t指针在此上下文中也是 const 。 但是, ar <<需要非常量引用** [1] **,因此它不应该编译。

尽管如此,MSVC 可能接受它的原因可能是因为 MSVC 有一个(邪恶的)非标准扩展,当绑定到非常量引用时,它会延长临时对象的生命周期

我的演示应用程序显示了序列化和反序列化:

int main()
{
    using namespace EDIN;
    std::unique_ptr<World> world(new World);

    world->cellSequence.push_back(12345);
    world->cellSequence.push_back(-6767);
    SaveWorld(world.get(), "world.save");

    world.reset(LoadWorld("world.save"));
    SaveWorld(world.get(), "world2.save");
}

你可以验证world.saveworld2.save最终对你自己是相同的(也在coliru 上)。

完整的 SSCCE 代码供参考:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/valarray.hpp>
#include <chrono>
#include <memory>

namespace EDIN
{
    struct Region
    {
        int id;
        Region(int id = 42) : id(id) {}

      private:
        friend class boost::serialization::access;
        template<class Archive> void serialize(Archive & ar, const unsigned int file_version)
        {
            ar & id;
        }
    };

    struct Scheme
    {
        std::string GetSchemeType() const { return "scheme_type_42"; }
    };


    class World
    {
        // dummy members to make it compile
        // will be different things of course
        int mass, epoch;
        std::chrono::system_clock::time_point _start;

        std::string report;
      public:
        std::vector<int> cellSequence; // for demo, public

        World(std::string&, EDIN::Region&, unsigned int&, const std::chrono::system_clock::time_point&)
            : mass(99), epoch(88), _start(std::chrono::system_clock::now()), report("Report101")
        {
            // TODO!
        }

        Region       Bounds() const { return Region();       }
        int          Epoch()  const { return epoch;          }
        EDIN::Scheme Scheme() const { return EDIN::Scheme(); }
        std::chrono::system_clock::time_point StartingWallTime() const {
            return _start;
        }

        World()
            : mass(99), epoch(88), _start(std::chrono::system_clock::now()), report("Report101")
        {
        }

        friend void SaveWorld(World* world, char const filename[]);
        friend World* LoadWorld(char const filename[]);

        private:
            friend class boost::serialization::access;
            template<class Archive> void serialize(Archive & ar, const unsigned int file_version)
            {
                ar & mass & epoch;
            }
    };
}

namespace boost
{
    namespace serialization
    {
        template<class Archive>
        inline void save_construct_data(Archive & ar, EDIN::World const * t, unsigned const int file_version)
        {
            time_t const totalRunningTime = std::chrono::duration_cast<std::chrono::duration<time_t, std::milli>>(
                std::chrono::system_clock::now() - t->StartingWallTime()).count();

            EDIN::Region const bounds = t->Bounds();
            time_t const epoch = t->Epoch();

            std::string tmp = t->Scheme().GetSchemeType();
            ar
                << bounds
                << epoch
                << totalRunningTime 
                << tmp;
        }

        template<class Archive>
        inline void load_construct_data(Archive & ar, EDIN::World * t, const unsigned int file_version)
        {
            EDIN::Region bounds;
            unsigned epoch;
            time_t totalRunningTime;
            std::string schemeType;
            ar >>
                bounds >>
                epoch >>
                totalRunningTime >>
                schemeType;

            std::chrono::system_clock::time_point const startingWallTime =
                std::chrono::system_clock::now() - std::chrono::duration<time_t, std::milli>(totalRunningTime);

            ::new(t) EDIN::World(schemeType,bounds,epoch,startingWallTime);
        }
    }
}

#include <fstream>

namespace EDIN {
    void SaveWorld(World* world, char const filename[])
    {
        std::ofstream ofs(filename);

        boost::archive::text_oarchive oa(ofs);

        oa << world << world->cellSequence << world->report; // line 590: error!
    }

    World* LoadWorld(char const filename[])
    {
        World *world = 0;

        std::ifstream ifs("world.save");
        boost::archive::text_iarchive ia(ifs);

        ia >> world;
        ia >> world->cellSequence >> world->report;

        return world;
    }
}

int main()
{
    using namespace EDIN;
    std::unique_ptr<World> world(new World);

    world->cellSequence.push_back(12345);
    world->cellSequence.push_back(-6767);
    SaveWorld(world.get(), "world.save");

    world.reset(LoadWorld("world.save"));
    SaveWorld(world.get(), "world2.save");
}

[1]出于晦涩的技术原因,超出了这里的范围

回答2

在有人提出真正的解决方案之前,这与其说是一种黑客攻击,不如说是一种答案。 问题似乎是 G++ 4.9 不想将World::thisWorld*World*& 。 用以下内容替换World::Save方法可以解决问题:

void World::Save(char const filename[])
{
    std::ofstream ofs(filename);

    boost::archive::text_oarchive oa(ofs);

    World* thisCopy = this;
    oa << thisCopy << cellSequence << report;
}

GCC 4.8.1 和 GCC 4.9 之间的行为似乎存在差异,导致后者无法编译,除非我创建this指针的副本。 如果有人能指出为什么会发生这种情况,以及它是否是一个错误或有意改变的行为,我们将不胜感激!

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • error: no match for 'operator<<' using boost::serialisation
    I am trying to get some (hitherto) windows code to compile on a unix machine but am getting some errors at the following method: namespace EDIN { void World::Save(char const filename[]) { std::ofstream ofs(filename); boost::archive::text_oarchive oa(ofs); oa << this << cellSequence << report; // line 590: error! } } The error looks like this: test.cpp: In member function ‘void EDIN::World::Save(const char*)’: test.cpp:122:12: error: no match for ‘operator<<’ (operand types are ‘boost::archive::text_oarchive’ and ‘EDIN::World*’) oa << this << cellSequence << report; // line 590: error! ^ test
  • 没有运算符匹配给定的名称和参数类型。 您可能需要添加显式类型转换。 — Netbeans,Postgresql 8.4和Glassfish(No operator matches the given name and argument type(s). You might need to add explicit type casts. — Netbeans, Postgresql 8.4 and Glassfish)
    问题 我正在尝试使用EclipseLink在Glassfish中使用JPA在Postgresql中编辑表。 当我插入一个实体时,它运行良好。 但是,当我尝试编辑或删除同一实体时,它失败并显示以下错误。 任何想法? Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = character varying Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. Position: 38 Error Code: 0 at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
  • 没有匹配'operator =='C ++的编译错误(No match for 'operator==' C++ compile error)
    问题 C ++新手提出的另一个问题。 我收到以下代码块的编译器错误“'operator =='不匹配” void swap(Team t1, Player p1, Team t2, Player p2){ Player new_t1[11]; Player new_t2[11]; for(int i=0; i<11; i++){ new_t1[i] = t1.get_player(i); new_t2[i] = t2.get_player(i); if(new_t1[i] == p1){ new_t1[i] = p2; } if(new_t2[i] == p2){ new_t2[i] = p1; } } cout << "Players swapped."; } 有任何想法吗? 回答1 编译器不知道这两个播放器相同意味着什么。 如果名称相同,它们是否相同? 还是他们的ID? 您需要为class Player定义==运算符。 bool operator == (const Player &p1, const Player &p2) { if( / * evaluate their equality */) return true; else return false; } 另外,我认为您的swap()函数现在没有任何作用。 您可能希望将其更改为通过引用接受Team和Player 。
  • “ pin”运算符的作用是什么,Elixir变量是可变的吗?(What is the “pin” operator for, and are Elixir variables mutable?)
    问题 当前正在尝试了解Elixir中的“ ^”运算符。 从网站: 如果不希望重新绑定变量,而是希望在匹配之前将其与值进行匹配,则可以使用pin运算符^: 来源-http://elixir-lang.org/getting_started/4.html 考虑到这一点,您可以像这样将新值附加到符号上: iex> x = 1 # Outputs "1" iex> x = 2 # Outputs "2" 我也可以: iex> x = x + 1 # Outputs "3"! 所以我的第一个问题是; Elixir变量可变吗? 看起来确实是这样……在函数式编程语言中这不可能吗? 现在,我们来谈谈“ ^”运算符... iex> x = 1 # Outputs "1" iex> x = 2 # Outputs "2" iex> x = 1 # Outputs "1" iex> ^x = 2 # "MatchError" iex> ^x = 1 # Outputs "1" 我认为“ ^”的作用是将“ x”锁定到与其绑定的最后一个值。 这就是全部吗? 为什么不仅仅像Erlang一样确保所有“匹配” /分配都是不变的? 我只是习惯了... 回答1 Elixir中的数据仍然是不可变的,但是有一些速记方式,可让您键入更少或不必担心查找新名称。 在Erlang中,您经常会看到这样的代码: SortedList
  • 没有运算符“ =”与这些操作数匹配(No operator “=” matches these operands)
    问题 所以这一定是很愚蠢的事情,但是我在这段代码中遇到了错误。 可能出了问题,操作数<,>也无效。 一个人使用向量的方式不同吗? 当我尝试y.at(1)= 10; 它说表达式必须具有类类型...? #include "stdafx.h" #include <iostream> #include "time.h" #include <vector> int main() { using namespace std; const long long l = 100000; vector <int> y[l]; long long x[l]; y[0] = 10; // Test statement results in Error. //for (long i = 0;i < l;i++) { // y.at(i) = i;//rand() % 100; // x[i] = rand() % 100; //} clock_t t = clock(); for (long long i = 0;i < l;i++) { long long r; r = y[i] ^ ((x[i]^y[i]) & -(x[i] < y[i])); /*if (x[i] < y[i]) { r = x[i]; } else { r = y[i]; }*/ } t = clock() - t; printf(
  • 什么是“ * this的右值参考”?(What is “rvalue reference for *this”?)
    问题 在clang的C ++ 11状态页面中遇到了一个名为“ * this的右值引用”的提案。 我已经阅读了很多有关右值引用并理解它们的知识,但是我认为我对此并不了解。 使用这些条款,我在网络上也找不到太多资源。 该页面上有一份建议书链接:N2439(将移动语义扩展到* this),但我从那里也没有太多示例。 这个功能是关于什么的? 回答1 首先,“ * this的ref-qualifiers”仅仅是一个“营销声明”。 *this的类型永远不会改变,请参阅本文的底部。 不过,用这种措辞更容易理解它。 接下来,以下代码根据功能†的“隐式对象参数”的ref限定符选择要调用的功能: // t.cpp #include <iostream> struct test{ void f() &{ std::cout << "lvalue object\n"; } void f() &&{ std::cout << "rvalue object\n"; } }; int main(){ test t; t.f(); // lvalue test().f(); // rvalue } 输出: $ clang++ -std=c++0x -stdlib=libc++ -Wall -pedantic t.cpp $ ./a.out lvalue object rvalue object
  • 在 C++ 中出现此错误,“在‘std:cin.std’中与‘operator>>’不匹配(Getting this error in C++, "no match for 'operator>>' in 'std:cin.std)
    问题 #include <iostream> int main() { using std::cout; using std::endl; using std::cin; short width; short legnth; short height; short volume; volume = (legnth * width * height); cout << "This program will determine the volume of a cube" << endl; cout << "Enter the legnth of the cube: "; cin >> legnth >> endl; cout << "Enter the width of the cube: "; cin >> width >> endl; cout << "Enter the height of the cube: "; cout << "Your volume is: " << volume; cout << "Press any key to exit :)"; cin.get(); return 0; 我是 C++ 新手,在我的基本计算机编程课程中,我们必须制作一些可以计算体积的东西,有人可以帮我解决这个错误吗? } 回答1 std::endl用于输出流而不是输入流。
  • 如何使用C ++ 11样式强类型定义创建新的原始类型?(How can I create a new primitive type using C++11 style strong typedefs?)
    问题 我正在尝试在C ++中模拟与Nim编程语言不同的类型。 以下示例不会在Nim中编译,因为尽管编译器捕获的变量e和d具有不同类型( Error: type mismatch: got (Euros, float) ),尽管它们都是二进制级别的浮点数: type Euros = distinct float when isMainModule: var e = Euros(12.34) d = 23.3 echo (e + d) 在C ++中执行此操作的一种方法是为float编写包装类。 但这对导出类型的API效果不佳,因为大小不会与float相同。 或者,即使类的大小与float的存储长度匹配,也绝不会与char类型的大小匹配。 如果您还实现了所有可能的运算符(例如加法,减法等)的操作,那将起作用,但是需要大量的输入和代码重复。 诸如创建新的原始类型之类的较早的问题已成为使用boost的强类型定义的公认答案。 但是typedef似乎仅适用于函数类型签名,typedef不会阻止将两个float继承的类型添加到一起,并且它们的类型完全更改(好吧,因为只是一种新类型的错觉): #include <boost/serialization/strong_typedef.hpp> #include <stdio.h> BOOST_STRONG_TYPEDEF(float, money)
  • 没有运算符“ <<”与这些操作数匹配(no operator “<<” matches these operands [duplicate])
    问题 这个问题已经在这里有了答案: 为什么我不能发出字符串? (7个答案) 3年前关闭。 不知道发生了什么。 我查看了与此问题类似的其他帖子,但到目前为止,没有解决方案。 这是带有错误注释的代码。 一方面,它表示!=不起作用,而在其余代码中,则表示<< <<不起作用。 #include <iostream> #include <algorithm> #include <vector> #include <ctime> #include <cstdlib> #include <cctype> using namespace std; //Hangman int main() { //setup vector<string> words; words.push_back("GUITAR"); words.push_back("VIRGINIA"); words.push_back("LAPTOP"); words.push_back("WIFEY"); words.push_back("IPHONE"); srand(static_cast<unsigned int>(time(0))); //randomly select a word random_shuffle(words.begin(), words.end()); const string THE_WORD = words
  • 没有用于初始化“mapped_type” std::map 错误的匹配构造函数(no matching constructor for initialization of 'mapped_type' std::map error)
    问题 我有一个名为“Card”的类,我试图将它的一些对象存储在 std::map Card.hpp 中: class Card { public: enum ValueType { NOVALUE, ACE }; enum FaceType { NOFACE, CLUBS }; Card(const ValueType & _value, const FaceType & _face); Card(const Card & _card); private: ValueType m_value; FaceType m_face; }; 这是我存储和访问它的方式:Deck.hpp: #include <map> class Card; class Deck { public: Deck(); std::size_t length() const; Card get_card(const int & _num); private: std::map<int, Card> m_deck; }; 甲板.cpp: #include "Card.hpp" Deck::Deck() { m_deck.insert(std::pair<int, Card>(0, Card(Card::NOVALUE, Card::NOFACE))); m_deck.insert(std::pair<int
  • 没有函数与给定的名称和参数类型匹配(No function matches the given name and argument types)
    问题 我的职能是: CREATE OR REPLACE FUNCTION FnUpdateSalegtab09 ( iacyrid Integer,iRepId Integer,iDrId Integer,ivrid Integer,imode smallint,itrno varchar,itrdate timestamp,iacid Integer,ivrno varchar,iSuppId Integer,icustname varchar,inetamt money,idisrate real,idisamt money,iRoundOff real,ijrmid integer,iuserid integer,iuserdtm timestamp,iVSNo integer,iRecdAmt money,icstrate real,icstsaleamt money,icstamt money,itdrate real,itdamt money,icdrate real,icdamt money,iCessRate real,iCessAmt money,iodesc1 varchar,ioamt1 money,iCashCredit boolean,iOrderNo varchar,iOrderDate timestamp,iCustAdd2 varchar
  • 为什么这里有歧义?(Why is this ambiguity here?)
    问题 考虑我有以下最少的代码: #include <boost/type_traits.hpp> template<typename ptr_t> struct TData { typedef typename boost::remove_extent<ptr_t>::type value_type; ptr_t data; value_type & operator [] ( size_t id ) { return data[id]; } operator ptr_t & () { return data; } }; int main( int argc, char ** argv ) { TData<float[100][100]> t; t[1][1] = 5; return 0; } GNU C ++给了我错误: test.cpp: In function 'int main(int, char**)': test.cpp:16: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for second: test.cpp:9: note: candidate 1
  • 尝试插入到std :: set时,“与'operator <'不匹配”(“no match for 'operator<'” when trying to insert to a std::set)
    问题 我正在使用gcc 4.3.3尝试编译以下代码: struct testStruct { int x; int y; bool operator<(testStruct &other) { return x < other.x; } testStruct(int x_, int y_) { x = x_; y = y_; } }; int main() { multiset<testStruct> setti; setti.insert(testStruct(10,10)); return 0; } 我收到此错误: / usr / include / c ++ / 4.4 / bits / stl_function.h | 230 |错误:“ __ x <__y”中的“ operator <”不匹配我怀疑我没有像应该做的那样做运算符重载,但我只是无法指出确切的问题。 我在这里做错了什么? 回答1 运算符必须为const并采用const引用: bool operator<(const testStruct &other) const { return x < other.x; }
  • 函数结果中的Fortran类(*)(Fortran Class (*) in Function Result)
    问题 我遇到了这篇文章中详述的函数的错误。 发生问题是因为我试图返回与输入类型相对应的类型。 任何人都可以提出解决方案吗? 我最初为每种类型都有一个函数,然后有一个通用接口将它们分组为相同的名称。 现在我试图使用多态将所有内容放在一个函数中。 这是gfortran给我的错误。 gfortran -o build/lib/foul.o -c -ffree-form -g -J./build/lib lib/foul.f lib/foul.f:471.45: Function cassign (expr, a, b, wrn) Result (c) 我曾尝试使用可分配的数组。 然后在主程序中 Character (len=65), Allocatable :: sc(:) Integer, Allocatable :: ic(:) Real, Allocatable :: rc(:) Allocate (sc(1)) Allocate (ic(1)) Allocate (rc(1)) sc = cassign (ra < rb, sa, sb) ic = cassign (ra < rb, ia, ib) rc = cassign (ra < rb, ra, rb) 这将返回以下错误 gfortran -o build / utests / test_foul.o -c -ffree
  • 是否有一个bash命令对文件进行计数?(Is there a bash command which counts files?)
    问题 是否有bash命令来计算与模式匹配的文件数? 例如,我要获取目录中与此模式匹配的所有文件的数量: log* 回答1 这个简单的单行代码应该可以在任何shell中运行,而不仅仅是bash: ls -1q log* | wc -l ls -1q将为每个文件提供一行,即使它们包含空格或换行符之类的特殊字符也是如此。 输出通过管道传送到wc -l,后者对行数进行计数。 回答2 您可以使用bash安全地执行此操作(即不会被名称中带有空格或\n的文件所困扰): $ shopt -s nullglob $ logfiles=(*.log) $ echo ${#logfiles[@]} 您需要启用nullglob,以便在没有文件匹配的情况下,不会在$logfiles数组中获取原义的*.log 。 (有关如何安全地重置它的示例,请参见如何“撤消”“ -x”设置。) 回答3 这里有很多答案,但有些没有考虑 包含空格,换行符或控制字符的文件名以连字符开头的文件名(想象一个名为-l的文件) 隐藏的文件,它们以点开头(如果全局文件是*.log而不是log* 与全局匹配的目录(例如,名为logs的目录,与log*匹配) 空目录(即结果为0) 很大的目录(列出所有目录可能会耗尽内存) 这是处理所有这些问题的解决方案: ls 2>/dev/null -Ubad1 -- log* | wc -l 解释:
  • Linux awk用法
    在学习awk之前我们应该都学过sed,grep,tr,cut等等命令,这些命令都是为了方便我们对Linux下文本和数据的处理,但是我们会发现很多时候这些命令并不能一下子就完全解决我们的需求,很多时候我们都需要使用管道符结合这些命令来使用,今天我就给大家介绍一个命令awk,他就能很好的解决我们对文本和数据处理的需求,使我们一条命令就解决很多问题。 一、awk命令简介 awk被称为文本处理三剑客之一,其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。所以说awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 二、awk命令格式及选项 语法形式awk [options] 'script' var=value file(s)awk [options] -f scriptfile var=value file(s)常用命令选项
  • 用python / linux方式比较两个图像(Compare two images the python/linux way)
    问题 Trying to solve a problem of preventing duplicate images to be uploaded. I have two JPGs. Looking at them I can see that they are in fact identical. But for some reason they have different file size (one is pulled from a backup, the other is another upload) and so they have a different md5 checksum. How can I efficiently and confidently compare two images in the same sense as a human would be able to see that they are clearly identical? Example: http://static.peterbe.com/a.jpg and http://static.peterbe.com/b.jpg Update I wrote this script: import math, operator from PIL import Image def
  • 正则表达式:是否有AND运算符?(Regular Expressions: Is there an AND operator?)
    问题 显然,您可以使用| (管道?)代表OR ,但是还有一种方法代表AND吗? 具体来说,我想匹配包含某个短语的全部但没有特定顺序的文本段落。 回答1 使用非消耗性的正则表达式。 典型的(即Perl / Java)表示法是: (?= expr ) 这表示“ match expr,但此后继续在原始匹配点进行匹配”。 您可以根据需要执行任意多个操作,这将是一个“ and”。 例子: (?=match this expression)(?=match this too)(?=oh, and this) 如果需要在其中使用一些数据,甚至可以在非使用表达式中添加捕获组。 回答2 您需要像其他一些响应者所说的那样使用前行,但是前行必须考虑其目标词和当前匹配位置之间的其他字符。 例如: (?=.*word1)(?=.*word2)(?=.*word3) 第一个前瞻中的.*使其可以匹配到达“ word1”之前需要的许多字符。 然后,将匹配位置重置,第二个超前查找出“ word2”。 再次重置,最后部分匹配“ word3”; 由于这是您要检查的最后一个词,因此不必先行查找,但这不会造成伤害。 为了匹配整个段落,您需要在两端固定正则表达式,并添加最终的.*以使用其余字符。 使用Perl样式的表示法,将是: /^(?=.*word1)(?=.*word2)(?=.*word3).*$/m 'm
  • ES 20 - 查询Elasticsearch中的数据 (基于DSL的查询, 包括validate、match、bool)
    本文介绍Elasticsearch的DSL(领域特定语言)的使用, 包括validate、match query、bool query等的使用方法, 详细而且都有使用示例~ 欢迎交流呀(⊙ o ⊙) 目录 1 什么是DSL 2 _validate - 校验查询语句是否合法 3 match query - 匹配查询 3.1 简单功能示例3.1.1 查询所有文档 3.1.2 查询满足一定条件的文档 3.1.3 分页查询文档 3.1.4 指定返回的结果中包含的字段 3.2 精确查询 - match_phrase3.2.1 精确匹配 - exact value 3.2.2 全文搜索 - full text 3.3 控制匹配规则 - operator 3.4 指定命中的百分比 - minimum_should_match 3.5 多字段的匹配 - multi_match 4 bool query - 布尔查询(真假查询)4.1 简单功能示例 4.2 嵌套使用bool query 4.3 直接filter操作 - 使用constant_score 4.4 指定should的匹配个数 - minimum_should_match 参考资料 版权声明 1 什么是DSL DSL: Domain Specific Language, 领域特定语言, 指的是专注于某个应用程序领域的
  • heroku,postgreSQL,django,注释,好吃的:没有运算符匹配给定的名称和参数类型。 您可能需要添加显式类型转换(heroku, postgreSQL, django, comments, tastypie: No operator matches the given name and argument type(s). You might need to add explicit type casts)
    问题 我对Django的内置注释模型有一个简单的查询,并在heroku的postgreSQL数据库中得到以下错误: DatabaseError: operator does not exist: integer = text LINE 1: ... INNER JOIN "django_comments" ON ("pi ns_pin"."id" = "django_... ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 遍历谷歌之后,似乎这个错误在django中已经被解决了很多次,但我还是得到了(所有相关问题已在3-5年前关闭)。 我正在使用django 1.4版和最新版本的tastypie。 该查询是在orm过滤器下进行的,并且可以与我的开发数据库(sqlite3)完美配合: class MyResource(ModelResource): comments = fields.ToManyField('my.api.api.CmntResource', 'comments', full=True, null=True) def build_filters(self, filters=None): if