私たちのプロジェクトで次の問題を抽出しました。次のコードは、g++ で正常にコンパイルされます
#include <vector>
class A {};
typedef std::vector<A*> vec_t;
class bar {
public:
bar(vec_t) {};
};
class foo
{
public:
foo(bar* a = new bar(vec_t())) {};
};
class B
{};
int main()
{
return 0;
}
ただし、Visual Studio Compiler (VC12、しかし他のすべてのコンパイラも想定) は、fooの c'torのデフォルト引数で、ベクトルのインスタンスを引数として取るbarの c'tor が呼び出されることを理解していません。 . これにより、この式の後に宣言されたすべてのクラス/構造体でエラーが発生します。
error C2462: 'B' : cannot define a type in a 'new-expression'
c'tor のソフトウェア設計については議論したくありませんが、これはコンパイラの問題ですか、それとも標準の C++ では許可されておらず、g++ はそれについて厳密ではありませんか?
まず、デフォルト パラメーターのテンプレートのインスタンス化が許可されていないか、デフォルトの引数で c'tor がネストされている可能性があると考えました。ただし、ベクターの別の c'tor を使用すると、次のようになります。
foo(bar* a = new bar(vec_t(0))) {}
MSVC でコンパイルされます。上位バージョンがコンパイルされない理由がわかりませんか? それについて何か考えはありますか?