[Bug c++/85060] New: Object cannot call its inherited member function "without object"
dingyuc at 126 dot com
gcc-bugzilla@gcc.gnu.org
Sat Mar 24 06:08:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85060
Bug ID: 85060
Summary: Object cannot call its inherited member function
"without object"
Product: gcc
Version: 7.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: dingyuc at 126 dot com
Target Milestone: ---
Created attachment 43746
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43746&action=edit
The source code "hierarchy.cc" and a preprocessed file "hierarchy.ii"
The attached source code can be compiled and executed by older versions of g++
but not by g++ 7.0.0 - 7.3.1. I managed to simplify the case into three level
of classes where child and grandchild classes are templates. The code has been
tested on Archlinux, OS_X and some online compilers, all confirming it's a gcc7
problem.
Simply the command
$ g++ hierarchy.cc
will yield
hierarchy.cc: In member function ‘void CC<T>::bar()’:
hierarchy.cc:20:32: error: cannot call member function ‘int CA::foo()’
without object
const SPECIFIER m = CA::foo(); // Won't pass!!
Here is the complete source code for people bothered to untar:
$ cat hierarchy.cc
#include <iostream>
#ifndef SPECIFIER
#define SPECIFIER int // fail with g++7
// #define SPECIFIER auto // fail with g++7, or invalid without c++11
// #define SPECIFIER T // pass with g++7 when int->T is possible
#endif
class CA {
public:
int foo() { return 42; }
};
template <class T>
class CB : public CA { };
template <class T>
class CC : public CB<T> {
public:
void bar() {
const SPECIFIER m = CA::foo(); // Won't pass!!
// const SPECIFIER m = this->CA::foo(); // This will work.
std::cout << "THE ULTIMATE ANSWER: " << m << std::endl;
}
};
int main(void) {
CC<double> c;
c.bar();
return 0;
}
More information about the Gcc-bugs
mailing list