5

「filter.h」というヘッダー ファイル内に次のメソッドがあります。

namespace std{

//some code

template <class T, class S, class BorderMethod>
tImage<T> binomial(const tImage<T> &in, const size_t k = 3) {
   //do some computations

  tImage<T> img = in.convolve<T, BorderMethod>(in, kernel);
  return img;
}
}

最初に気づいたこと: このメソッドの定義は、ヘッダー ファイル内で行われます。それは標準的な手順ですか?

さて、実際の問題: メソッドの呼び出しは、そのようなメソッドを持っていconvolveても機能しません。クラス内のinメソッドの定義は次のとおりです。convolvetImage<T>

tImage<T> convolve(const gravis::tImage<T>& image, const gravis::tArray<typename tImageTraits<T>::Float_t>& kernel);

この関数を呼び出すにはどうすればよいですか?

4

2 に答える 2

6

最初に気づいたこと: このメソッドの定義はヘッダー ファイル内で行われます。それは標準的な手順ですか?

はい。通常、関数テンプレートの定義はヘッダーに配置されます。それらが別の.cppファイルに追いやられている場合、コンパイラは呼び出されたときにそれらを暗黙的にインスタンス化できず、適切なアクションをとらない限り、リンカーは未定義の参照について不平を言うことになります。詳細については、StackOverflow に関するこの Q&A を参照してください。

メソッド convolve の呼び出しは機能しませんが、 in にはそのようなメソッドがあります。

convolve()は非constメンバ関数であり、 への参照を通じて呼び出そうとしていますconst。これは違法であり、コンパイラはそれを伝えています。


さらに、 JBentleyの回答で正しく指摘されているように、std名前空間に新しい宣言または定義を追加することはできません。C++11 標準のパラグラフ 17.6.4.2.1/1 によると:

特に指定がない限り、名前空間 std または名前空間 std 内の名前空間に宣言または定義を追加する場合、C++ プログラムの動作は未定義です。[...]

于 2013-03-18T21:09:11.830 に答える
3

問題の原因ではありませんが、std名前空間内に不正に配置されているため、コードの動作は未定義です。

この質問またはこれを参照してください。

于 2013-03-18T21:15:16.007 に答える