私が使用して、ブースト::ファイルシステム::パスの私の独自の実装を作成しようとしていますと仮定Curiously Recurring Template Pattern:宣言が解決しないエラー「明示的な特殊化をインスタンス化した後」
(コードは、簡潔にするために不完全与えられているが、述べたようにGCC 4.8.4を使用して、 'g++ -std=c++11 -o mypath ./mypath.cpp
' でコンパイルした場合)、問題を示すであろう
mypath.hpp:
#ifndef MYPATH_HPP
#define MYPATH_HPP
#include <string>
#include <vector>
namespace my {
template <class T>
class PathBase
{
public:
PathBase();
PathBase(std::string const& p);
std::string String() const;
bool IsSeparator(char c) const;
std::string Separators() const;
typedef std::vector<std::string> pathvec;
protected:
pathvec _path;
private:
virtual std::string _separators() const =0;
};
class Path : public PathBase<Path>
{
public:
Path();
Path(std::string const& p);
private:
virtual std::string _separators() const final;
};
} // namespace 'my'
#endif // MYPATH_HPP
mypath.cpp:もちろん
#include "mypath.hpp"
namespace my {
//////////template class PathBase<Path>;
template<>
bool PathBase<Path>::IsSeparator(char c) const
{
return (Separators().find(c) != std::string::npos);
}
template <>
std::string PathBase<Path>::Separators() const
{
return _separators();
}
} // namespace
int main(int argc, char** argv)
{
return 0;
}
IsSeparator()
が暗黙のうちにそれをインスタンス化した後、私は明示的にSeparators()
を専門とするので、私は、書かれたとして、コードはコンパイルされませんことを発見しました。しかし私は特に、私のすべての方法を好意的に発注しようとしています。
SOに関する同様の質問を調べているうちに、このaccepted answerは私の専門性を宣言するだけでこの問題をきちんと解決できることを示唆していました。しかし...それはちょっと私のヘッダファイルのように感じている
- mypath.cppで私のコメントアウト
template class PathBase<Path>;
ラインが問題に影響を及ぼさなかった、と - はすでにその全体
class Path : public PathBase<Path> { ... }
宣言と明示的な特殊化を宣言します。
明確に宣言する必要がありますか?
これはおそらく私が今までに受けた最高の答えだと思います!ありがとうございました。 –