2017-09-14 13 views
1

私はテンプレート関数をcppファイルの匿名の名前空間の中で、まったく異なるサイズのstd :: array型のヘルパー関数として持っていたいと思っていました。この関数は、この翻訳ユニットの外では使用できません。これはC++標準に準拠していcppファイルの匿名の名前空間の中にテンプレート関数を持つのは適切ですか?

namespace 
{ 

template<std::size_t SIZE> 
bool isPushed(std::uint32_t id, std::array<std::uint32_t, SIZE>& states) 
{ 
    if(id >= states.size()) 
    { 
     return false; 
    } 

    return ((states[id] & 32U) > 0U); 
} 

} 

:私はMSVC 14.1(簡略化されたコード)でそれをしようとしたとき

は全く驚くべきことに私には、これはすぐに出て働いていましたか?

私が知っていたことから、テンプレートは常にヘッダーに宣言する必要があります。

答えて

4

これはC++標準に準拠していますか?

絶対に。

私が知っていたことから、テンプレートは常にヘッダーに宣言する必要があります。

これは、テンプレートが複数の翻訳単位(.cppファイルを読む)で使用されている場合にのみ当てはまります。 extern templateを使用して.cppファイルでテンプレートを実装する方法があります。 https://msdn.microsoft.com/en-us/library/by56e477.aspxを参照してください。

ただし、1つの.cppファイルでのみ使用されている場合は、.cppファイルで定義するのがまったく問題ありません。 https://timsong-cpp.github.io/cppwp/n3337/temp#4

テンプレート名からOPさんのコメント

に応じて


追加情報は、リンケージを持っています。 https://timsong-cpp.github.io/cppwp/n3337/basic.link#2.2

から

- 名前が内部結合を有する場合、それが意味するエンティティが同じ翻訳単位内の他のスコープから名前で参照することができます。 https://timsong-cpp.github.io/cppwp/n3337/basic.link#4

名前名前空間または名前の名前空間内で直接または間接的に宣言された名前空間から

は、内部結合を有します。他のすべての名前空間には外部リンケージがあります。テンプレート - それは

の名前...

ている場合、上記内部結合を与えられていない名前を有する名前空間の範囲は、囲んでいる名前空間と同じリンケージを有しています。

上記から、isPushedは内部結合を有すると結論することができる。翻訳単位でのみ参照することができます。

+1

複数の翻訳単位で使用されていても、「extern template」を使用してcppファイルにそれらを実装する方法があります。 https://msdn.microsoft.com/en-us/library/by56e477.aspx –

+0

@ r-sahuこれが記述されているC++標準の引用/参照はありますか?素晴らしいことだ。 – Ident

+0

@Ident、私はこの標準について特に言及しているのか分かりません。私は関連性のある何かを見つけることができるかどうか少し調べるでしょう。 –

関連する問題