Regarding your errors,

For error 1:
You are calling the constructor without any parameter, but you defined your constructor to accept two parameters.

For error 2:
`co.asset__c` is a lookup field (of `Id` data type), but you are comparing it against an `SObject`.

```java
public static void ChangeOrderDuplicateChecker(List<Change_Order__c> cos)
{   ChangeOrderWrapper cow = new ChangeOrderWrapper();

        for(Change_Order__c co : trigger.new)
        {
            if(co.asset__c == cow.ast && co.opportunity__c == cow.opp)
            {
                co.addError('Testing');
            }
        }
}
```
To your question, I think you are complicating things a little bit. You can build a composite keys based on asset and opportunity lookup field and check if it already presents:
```java
Set<Id> assetIds = new Set<Id>();
Set<Id> oppIds = new Set<Id>();
for(Change_Order__c co : trigger.new) {
    assetIds.add(co.asset__c);
    oppIds.add(co.opportunity__c);
}
Set<Id> compositeKeys = new Set<Id>();
for (Change_Order__c co : [SELECT asset__c, opportunity__c FROM Change_Order__c WHERE asset__c = :assetIds OR opportunit__c = :oppIds]) {
    compositeKeys.add(co.asset__c + co.opportunity__c);
}

for(Change_Order__c co : trigger.new) {
    if (compositeKeys.contains(co.asset__c + co.opportunity__c)) {
        co.addError('Duplicate found!');
    }
}

```

Or, you might be able to use no-code solution: Duplicate Rules