6

次のコードを検討してください。

struct Undefined;

template <typename T>
void TemplateFunction()
{
  Undefined obj;
}

int main()
{
  return 0;
}

テンプレート関数とテンプレート メソッド (またはテンプレート クラスの一部のメソッド) は、(インスタンス化されていない限り) 構文のみがチェックされ、その場合は上記のコードコンパイルする必要があるという印象を常に受け​​ていました。

問題は、Xcode (ver: 4.3.2、LLVM コンパイラを使用) でコンパイルできないことです。上記のコードが非標準であるかどうか、つまり、C++03 標準に準拠するコンパイラでコンパイルするべきではないかどうか疑問に思っています。 ? Xcode からのエラーは次のとおりです。

変数には不完全な型「未定義」があります

元のコードでは、未定義のオブジェクトは静的アサーションの一部であることに注意してください。

4

1 に答える 1

7

他のコンパイラが喜んで受け入れるとしても、コンパイラがコードを拒否するのは正しいことです。特に、引用は§14.6[temp.res]/8内にあります

[...] テンプレート定義に対して有効な特殊化を生成できず、そのテンプレートがインスタンス化されていない場合、テンプレート定義は不適切な形式であり、診断は必要ありません。[...] 非依存の名前で使用される型が、テンプレートが定義された時点では不完全であるが、インスタンス化が行われた時点では完全である場合、およびその型の完全性が、プログラムは整形式であるか、プログラムのセマンティクスに影響を与えます。プログラムは整形式ではありません。[...]

つまり、コンパイラが診断する必要はありませんが、テンプレートの形式が正しくありません。

于 2012-08-12T00:46:58.547 に答える