You are going to have to do something like this first: (from your link)

    BusinessHours bh = [SELECT Id FROM BusinessHours WHERE IsDefault=true];

Then use that id as the first parameter in the method:

    diff(bh.id, startdate, Datetime.now())<48)

You were getting an error message because you were using the name of the type of parameter that you needed to put into the function instead of using a value of that type.

---

 I got this to run:

    BusinessHours bh = [SELECT Id FROM BusinessHours WHERE IsDefault=true];
    Datetime startdate = Datetime.newInstance(2013, 5, 28, 1, 6, 8);
    long l = BusinessHours.diff(bh.id,startdate,system.now());
    system.debug(l);  


---

I this also worked for me: 

    BusinessHours bh = [SELECT Id FROM BusinessHours WHERE IsDefault=true];
    Case c = [SELECT ClosedDate FROM Case WHERE ClosedDate != NULL LIMIT 1];

    DateTime startdate = c.ClosedDate;
    DateTime systemnow = system.now();

    long startl = startdate.getTime();
    long nowl   = systemnow.getTime();
    long diffl  = BusinessHours.diff(bh.id,startdate,systemnow);

    system.debug('startl: ' + startl);
    system.debug('nowl: '   + nowl);
    system.debug('nowl - startl: ' + (nowl - startl));
    system.debug('diffl: '  + diffl);

    system.assertEquals(nowl-startl,diffl);

----

    Trigger Test_Business_hours_Trigger on EmailMessage (after insert) {
        BusinessHours bh = [SELECT Id FROM BusinessHours WHERE IsDefault=true];
        list<Id> RelatedCaseIds = new list<Id>();
        for(EmailMessage em : Trigger.New){
            RelatedCaseIds.add(em.ParentId);
        }
        list<Case> CasesToUpdate= new list<Case>();
        for(Case c : [SELECT Id, ClosedDate FROM Case WHERE Id IN RelatedCaseIds]){
            if(BusinessHours.diff(bh.Id,c.ClosedDate.getTime(),system.now().getTime()) >  172800000){
                c.Status = 'Working';
                CasesToUpdate.add(c);
            }
        }
        update CasesToUpdate;
    }