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