Visual Studio 2010でコンパイルして正常に動作するさまざまなタイプを取得および設定するために、関数テンプレートの特殊化を使用するバリアントクラスがあります。ただし、このコードは、redhat、ubuntuなどでコンパイルする必要がある一般的なソリューションにありました.
非名前空間スコープでの明示的な特殊化の行に沿ってエラーを受け取りました。簡単な修正は、同じ名前空間内のクラスのスコープ修飾子を使用して、クラスの外部で特殊化を定義することであると考えました。
ただし、さまざまな型から変換するためのクラスの他のメソッドがクラス内でこのテンプレートを使用しているため、インスタンス化後に特殊化が発生するというエラーが発生しています。
したがって、次のようなことを行う正しい方法は何ですか:
namespace Example
{
class CSomeVariant
{
public:
bool toString(std::string& out)
{
return get(out);
}
private:
template <typename T>
bool get(T& val)
{
try {
val = boost::any_cast<T>(m_stored);
}
catch (...) {
return false;
}
return true;
}
boost::any m_stored;
};
template<>
bool CSomeVariant::get(std::string& val)
{
try {
if (m_stored.type() != typeid(std::string))
val = convertToString();
else
val = boost::any_cast<std::string>(m_stored);
}
catch(...) {
return false;
}
return true;
}
}
注: これは実際のコードではありませんが、問題を示していると思います。