GCC の関数のマルチバージョン化を使用する次のコード スニペットを検討してください。
//ver.h
#include<string>
namespace nt {
__attribute__ ((target ("default"))) std::string version();
__attribute__ ((target ("sse2"))) std::string version();
__attribute__ ((target ("ssse3"))) std::string version();
__attribute__ ((target ("sse4"))) std::string version();
}
//ver.cpp
#include "ver.h"
using namespace nt;
__attribute__ ((target ("default"))) std::string nt::version() { return "default"; }
__attribute__ ((target ("sse2"))) std::string nt::version() { return "sse2"; }
__attribute__ ((target ("ssse3"))) std::string nt::version() { return "ssse3"; }
__attribute__ ((target ("sse4"))) std::string nt::version() { return "sse4"; }
関数がグローバル名前空間にある場合、コードは正常に機能します。ただし、それらが名前空間内にラップされている場合、コンパイルは失敗します
error: missing ‘target’ attribute for multi-versioned std::string nt::version()
GCC 4.8.2 を使用しています。どんな助けでも大歓迎です。