2

まあ、私は明示的なテンプレートのインスタンス化によって非常に混乱していると思います ~>_<~

  1. 明示的なインスタンス化宣言は、暗黙的なインスタンス化定義を悪用できますか?
  2. 明示的および暗黙的なインスタンス化定義がプログラムに存在する場合はどうなりますか? それらは最終的に1つに崩壊しますか?
  3. 明示的なインスタンス化宣言は、暗黙的なインスタンス化の定義の後に配置すると効果がありますか?

また、次のコードも参照してください。

#include <iostream>
#include <vector>

std::vector<int> a;  // Implicit instantiation definition.

// Explicit instantiation declaration.
extern template class std::vector<int>; 

int main() {
  std::cout << std::vector<int>().size();  // So what?
}

リンクエラーの原因となります

/tmp/ccQld7ol.o: In function `_GLOBAL__sub_I_a':
main.cpp:(.text.startup+0x6e): undefined reference to `std::vector<int, std::allocator<int> >::~vector()'
collect2: error: ld returned 1 exit status

GCC 5.2 を使用しますが、clang 3.6 で正常にビルドされます。基準で正しいのはどれか。

上記のすべての質問に対する答えを論理的に推測して説明できるように、明示的なテンプレートのインスタンス化を理解するための洞察に満ちた方法があることを願っています。

4

2 に答える 2

1

[temp.explicit]/p11:

明示的なインスタンス化宣言の対象であり、翻訳単位で暗黙的なインスタンス化 (14.7.1) を引き起こす方法でも使用されるエンティティは、プログラムのどこかで明示的なインスタンス化定義の対象となります。それ以外の場合、プログラムは不正な形式であり、診断は必要ありません。

于 2015-10-02T01:15:47.253 に答える