Udostępnij za pomocą


Błąd kompilatora C3066

istnieje wiele sposobów wywoływanych przez obiekt tego typu za pomocą tych argumentów

Uwagi

Kompilator wykrył niejednoznaczne wywołanie funkcji z udziałem zastępców.

Przykłady

Poniższy przykład generuje kod C3066:

// C3066.cpp
template <class T, class U> void func(T*, U*){}

typedef void (*PF)(const int*, const char*);
typedef void (*PF1)(const int*, volatile char*);

struct A {
   operator PF() const {
      return func;
   }

   operator PF1() {
      return func;
   }

   operator PF1() const  {
      return func;
   }

};

int main() {
   A a;
   int i;
   char c;

   a(&i, &c);   // C3066
   a(&i, (const char *) &c);   // OK
}

Inicjowanie listy kopiowania

W programie Visual Studio 2015 kompilator błędnie potraktował inicjowanie kopiowania listy w taki sam sposób jak zwykłe inicjowanie kopii; rozważał tylko konwertowanie konstruktorów na potrzeby rozpoznawania przeciążeń. W poniższym przykładzie program Visual Studio 2015 wybiera pozycję MyInt(23), ale program Visual Studio 2017 poprawnie zgłasza błąd.

// From https://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1228
struct MyList {
       explicit MyStore(int initialCapacity);
};

struct MyInt {
       MyInt(int i);
};

struct Printer {
       void operator()(MyStore const& s);
       void operator()(MyInt const& i);
};

void f() {
       Printer p;
       p({ 23 }); // C3066: there are multiple ways that an object of this type can be called with these arguments
}