C++ 转换问题

C++ 转换问题,c++,gcc,compilation,C++,Gcc,Compilation,我使用的是GCC4.3.2 我有以下代码(简化): 但c-tor接收常量字符* UDP: 如果我从收到的第一份c-tor中删除explicit 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<SIZE>::Buffe

我使用的是GCC4.3.2

我有以下代码(简化):

但c-tor接收常量字符*

UDP:

如果我从收到的第一份c-tor中删除explicit

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<SIZE>::Buffer(const char*) [with int SIZE = 10]
test.cpp:25: error:   initializing argument 1 of ‘void Foo(A)’
test.cpp:在函数“int main()”中:
test.cpp:25:错误:对“Buffer::Buffer(A)”的调用没有匹配的函数
test.cpp:7:注意:候选项是:Buffer::Buffer(const char*)[int SIZE=10]
test.cpp:25:错误:初始化“void Foo(A)”的参数1
如果我使用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)’
test.cpp:在函数“int main()”中:
test.cpp:25:错误:对“Buffer::Buffer(A)”的调用没有匹配的函数
test.cpp:25:错误:初始化“void Foo(A)”的参数1

您的转换构造函数被声明为显式的
。关键字
explicit
专门用于防止该构造函数进行隐式转换。隐式转换正是您希望在代码中发生的(在
Foo
调用中)


如果希望构造函数在隐式转换中工作,为什么要声明构造函数
显式

转换构造函数声明为
显式
。关键字
explicit
专门用于防止该构造函数进行隐式转换。隐式转换正是您希望在代码中发生的(在
Foo
调用中)


如果希望构造函数在隐式转换中工作,为什么要声明构造函数
explicit
。正如Andrey所指出的,没有用于转换的隐式可调用构造函数。你得写信

Foo(A(b.c_str()));

这将使用const char的显式构造函数创建类型为a的临时“自动”(未命名)对象。这将传递给Foo。

A和B是完全不同的类型。正如Andrey所指出的,没有用于转换的隐式可调用构造函数。你得写信

Foo(A(b.c_str()));

这将使用const char的显式构造函数创建类型为a的临时“自动”(未命名)对象。当调用B时,它将被传递给Foo。

类型应该由B.c_str()构造,即const char*。A的第一个c-tor接收常量字符*,因此显式在这里应该不是问题。我错过什么了吗?是的<代码>显式
意味着编译器不会完全这样做。如果删除explicit,它将能够隐式地进行转换。@idimba:您正在将一个
const char*
传递给一个需要
a
的函数
const char*
不是
A
,因此需要进行转换。但是编译器不能使用
A::A(const char*)
转换构造函数,因为它被声明为
explicit
。如果您希望使用此构造函数,则必须详细说明显式转换
Foo(A(b.c_str())
,因为复制构造函数也被声明为
explicit
,所以所有按值传递
A
的尝试都将失败。停止滥用
explicit
:)我再次查看标准,发现GCC做了错误的事情(comeau编译他的代码时只有第一个是隐式的),而只有第一个是隐式的:
Foo(b.c_str())应该可以正常工作,但是
Foo(A(b.c_str())应失败。但GCC在这两方面都失败了。不过,我认为这是违反直觉的。无论如何,当调用XDB时,让这些显式词消失。类型应该由B.c_str()构造,即const char*。A的第一个c-tor接收常量字符*,因此显式在这里应该不是问题。我错过什么了吗?是的<代码>显式
意味着编译器不会完全这样做。如果删除explicit,它将能够隐式地进行转换。@idimba:您正在将一个
const char*
传递给一个需要
a
的函数
const char*
不是
A
,因此需要进行转换。但是编译器不能使用
A::A(const char*)
转换构造函数,因为它被声明为
explicit
。如果您希望使用此构造函数,则必须详细说明显式转换
Foo(A(b.c_str())
,因为复制构造函数也被声明为
explicit
,所以所有按值传递
A
的尝试都将失败。停止滥用
explicit
:)我再次查看标准,发现GCC做了错误的事情(comeau编译他的代码时只有第一个是隐式的),而只有第一个是隐式的:
Foo(b.c_str())应该可以正常工作,但是
Foo(A(b.c_str())应失败。但GCC在这两方面都失败了。不过,我认为这是违反直觉的。不管怎样,让那些明确的问题消失xd或删除
明确的
,我会添加。或删除
明确的
,我会添加。我发布了一个类似的问题,但在一个更简单的案例中,出现了相同的问题,没有“明确的”干扰。我发布了一个类似的问题,但在一个更简单的Striped down案例中,同样的问题没有“明确”的干扰。
Foo(A(b.c_str()));