Project(引数)という定義の仕方はいってしまえばコンストラクターを直接呼び出してる処理だと思いますがなぜエラーにならないのかという疑問です。
その2:せっかく比較演算子をオーバーロードしているにもかかわらず、void list<>::merge(list<>&)はなぜそれを使わないのかという質問です。
#include<iostream>
#include<cstring>
#include<list>
using namespace std;
class Project{
char name[40];
int days;
public:
Project(){days=0;*name='\0';}
Project(char *s,int d){strcpy(name,s);days=d;}
Project &operator+(int n){this->days+=n; return *this;}
Project &operator-(int n){this->days-=n; return *this;}
int empty(){return !days;}
friend ostream &operator<<(ostream &,Project &);
operator int(){return this->days;}
int operator==(Project &o){return (int)*this==(int)o;}
int operator<(Project &o){return (int)*this < (int)o;}
int operator>(Project &o){return (int)*this > (int)o;}
int operator!=(Project &o){return (int)*this!=(int)o;}
};
ostream &operator<<(ostream &stream,Project &o){
stream << o.name << "残り:" << o.days << "日\n";
return stream;
}
int main(){
list<Project> l1,l2;
list<Project>::iterator p;
l1.push_back(Project("コンパイラ",35)); //なぜnew Project(引数)ではエラーになるのか
l1.push_back(Project("スプレッドシート",190));
l1.push_back(Project("STL実装",1000));
l2.push_back(Project("データベース",780));
l2.push_back(Project("メールマージ",50));
l2.push_back(Project("COMオブジェクト",300));
l1.merge(l2);
p = l1.begin();
while(p!=l1.end())
cout << *p++;
p = l1.begin();
cout << ((int)*p > (int)*++p);
return 0;
}