我正在使用gcc 4.3.2.
我有以下代码(简化):
#includetemplate class Buffer { public: explicit Buffer(const char *p = NULL) {} explicit Buffer(const Buffer &other); const char *c_str() const { return m_buffer; } private: char m_buffer[SIZE]; }; typedef Buffer<10> A; typedef Buffer<20> B; void Foo(A a) { } int main() { B b; Foo(b.c_str()); // line 25 fails compilation return 1; }
编译产量:
test.cpp: In function ‘int main()’: test.cpp:25: error: conversion from ‘const char*’ to non-scalar type ‘A’ requested
但是有接收const char*的c-tor.
UDP:
如果我从第一个c-tor中删除了我收到的
test.cpp: In function ‘int main()’: test.cpp:25: error: no matching function for call to ‘Buffer<10>::Buffer(A)’ test.cpp:7: note: candidates are: Buffer::Buffer(const char*) [with int SIZE = 10] test.cpp:25: error: initializing argument 1 of ‘void Foo(A)’
如果我使用Foo(A(b.c_str()))我收到:
test.cpp: In function ‘int main()’: test.cpp:25: error: no matching function for call to ‘Buffer<10>::Buffer(A)’ test.cpp:25: error: initializing argument 1 of ‘void Foo(A)’
AnT.. 13
您的转换构造函数已声明explicit
.关键字explicit
专门用于防止该构造函数的隐式转换.隐式转换正是您期望在代码中发生的(在Foo
调用时).
explicit
如果您希望它在隐式转换中工作,为什么要声明构造函数?
您的转换构造函数已声明explicit
.关键字explicit
专门用于防止该构造函数的隐式转换.隐式转换正是您期望在代码中发生的(在Foo
调用时).
explicit
如果您希望它在隐式转换中工作,为什么要声明构造函数?