1
template< typename T >
void addVarCB(const std::string &name,
              TwSetVarCallback setCallback, TwGetVarCallback getCallback,
              void * clientData, const std::string &def = "" );

template< class C, typename T >
void addVarCB(const std::string &name,
              C * _this, T(C::*getter)(void), const std::string &def = "");

次のコードは、実行時にコンパイルおよびクラッシュします。

bar_->addVarCB<MyClass, unsigned>("foo", this, &MyClass::MyClassFn, nullptr);

パラメータを引数として取る関数がないため、実際にはまったくコンパイルされないと思います。(「MyClass、unsigned」は不要ですが、明確にするために...)

4

2 に答える 2

6

悲しいことに、std::stringから構築可能です。具体的には、こちらnullptrを参照してください。(5)

basic_string( const CharT* s, // <== 'nullptr' matches here
              const Allocator& alloc = Allocator() );

ノート:

5) が指すヌル終了文字列の内容で文字列を構築しますs。文字列の長さは、最初のヌル文字によって決まります。ポインターsであってはなりません。NULL

于 2012-09-18T19:00:14.480 に答える
5

最初のコメントは、これはテンプレート演繹とは無関係だということです。テンプレート引数を提供しているため、控除は使用されず、2 番目のテンプレートが使用されます。

関数呼び出しは、 からnullptrへの変換があるためコンパイルされます。これconst char*を使用してstd::stringconst char*. そのコンストラクターのコントラクトでは、ポインターが有効であり、コードで false である null で終了する一連の文字を指している必要があります。

于 2012-09-18T19:02:36.303 に答える