次のシナリオを考えてみましょう: いくつかのポリモーフィック クラス:
struct iClass
{
virtual ~iClass(){}
};
struct CommonClass : public iClass
{
char str[128];
CommonClass() { ... }
...
};
struct SpecificClass : public iClass
{
char str[32];
SpecificClass () { ... }
SpecificClass (SpecificClass& src) { strcpy(...); ... }
SpecificClass (CommonClass& src) { strcpy(...); ... }
SpecificClass (const CommonClass& src) { strcpy(...); ... }
void foo() { ... }
};
さらに機能:
void someFunc(SpecificClass sc) { sc.foo(); } // pass by value: i want it copied!
int main ()
{
CommonClass comCl;
someFunc(comCl); // <- Error: no matching function for call to 'SpecificClass::SpecificClass(SpecificClass)' NOTE: no &
SpecificClass specCl(comCl);
someFunc(specCl); // Works normal, but the str gets copied double times this way, isnt it?
return 0;
}
コンパイラは、最初の関数呼び出しで CommonClass から SpecificClass への変換を許可しないのはなぜですか? そして、なぜこの奇妙なエラーメッセージが表示されるのですか? 参照なしでコピー コンストラクターを呼び出しますか? 誰かがこの問題についての洞察を共有できますか?
ところで、私はgcc 4.1.2を使用する必要があります