转换问题

时间:2009-11-02 19:41:09

标签: c++ gcc compilation

我正在使用gcc 4.3.2。

我有以下代码(简化):

#include <cstdlib>

template<int SIZE>
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<SIZE>::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)’

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:3)

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

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

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